Bagaimana saya bisa meningkatkan pengecekan dan penanganan kesalahan saya?

13

Akhir-akhir ini saya telah berjuang untuk memahami apa jumlah pemeriksaan yang tepat dan apa metode yang tepat.

Saya punya beberapa pertanyaan tentang ini:

Apa cara yang tepat untuk memeriksa kesalahan (input buruk, kondisi buruk, dll)? Apakah lebih baik untuk secara eksplisit memeriksa kesalahan, atau menggunakan fungsi seperti pernyataan yang dapat dioptimalkan dari kode akhir Anda? Saya merasa seperti secara eksplisit memeriksa program dengan banyak kode tambahan yang tidak seharusnya dieksekusi dalam kebanyakan situasi - dan belum lagi sebagian besar kesalahan berakhir dengan kegagalan batalkan / keluar. Mengapa mengacaukan fungsi dengan pemeriksaan eksplisit hanya untuk membatalkan? Saya telah mencari konfirmasi versus memeriksa kesalahan secara eksplisit dan menemukan sedikit untuk benar-benar menjelaskan kapan harus melakukan keduanya.

Sebagian besar mengatakan 'gunakan menegaskan untuk memeriksa kesalahan logika dan menggunakan pemeriksaan eksplisit untuk memeriksa kegagalan lainnya.' Ini sepertinya tidak membuat kita terlalu jauh. Apakah kita akan mengatakan ini layak:

Malloc returning null, check explictly
API user inserting odd input for functions, use asserts

Apakah ini akan membuat saya lebih baik dalam memeriksa kesalahan? Apa lagi yang bisa saya lakukan? Saya benar-benar ingin memperbaiki dan menulis kode 'profesional' yang lebih baik.

Segera
sumber
3
Pertanyaan yang bagus, tapi saya pikir mungkin lebih cocok untuk salah satu situs saudara (programmer?).
Terima kasih, saya tidak yakin. Saya pikir karena itu SO yang berhubungan dengan kode akan baik-baik saja.
Anon
3
Jawaban sederhananya adalah "Inilah sebabnya pengecualian diciptakan. Dapatkan bahasa yang lebih baik."
DeadMG
1
@DeadMG: setjmp/ longjmptersedia dalam C, jadi Anda tidak perlu bahasa baru.
user786653
3
@DeadMG: Seseorang yang tidak bisa mendapatkan C memeriksa kesalahan dengan benar memiliki peluang bola salju di neraka mendapatkan C ++ pengecualian menangani dengan benar ...
Coder

Jawaban:

4

Cara termudah bagi saya untuk mengatakan perbedaannya adalah untuk menentukan apakah kondisi kesalahan diperkenalkan pada waktu kompilasi atau waktu berjalan. Jika masalahnya adalah programmer menggunakan fungsi yang salah, buat pernyataan untuk menarik perhatian pada masalah, tetapi begitu perbaikannya dikompilasi ke dalam kode panggilan, Anda tidak perlu khawatir untuk memeriksanya lagi. Masalah seperti kehabisan memori atau input pengguna akhir yang buruk tidak dapat diselesaikan pada waktu kompilasi, jadi Anda membiarkan cek masuk.

Karl Bielefeldt
sumber
2

Periksa apa saja kapan saja (bisa saja berubah setelah cek terakhir Anda) yang tidak 100% di bawah perintah Anda . Dan juga: Selama pengembangan bahkan tidak percaya diri! ;-)

Okokok ... "apa pun" dimaksudkan untuk dibaca sebagai memeriksa hal-hal seperti itu yang akan menyebabkan aborsi abnormal atau apa pun yang dapat membuat aplikasi / sistem Anda melakukan hal-hal yang seharusnya tidak dilakukan.

Untuk menjadi serius, bagian terakhir dari kalimat terakhir sangat penting karena itu menunjuk ke masalah utama:

Jika Anda ingin membangun sistem yang stabil, perhatian utama bukanlah tentang apa yang harus dilakukan oleh sistem, tetapi untuk membuatnya dapat melakukan hal-hal wajib seperti itu, seseorang perlu mengurus apa yang seharusnya tidak dilakukan, bahkan jika itu "mengacaukan Anda kode".

alk
sumber
1
+1 untuk 'periksa semuanya'. Saya tidak membeli argumen kekacauan kode: programmer mana pun harus dapat membedakan antara pengecekan kesalahan dan logika aktual.
stijn
2

Inti dari penanganan kesalahan bukanlah apakah dan bagaimana Anda menangkap masalah. Ini lebih dari apa yang Anda lakukan setelah Anda mempelajarinya .

Pertama - saya akan mengatakan, tidak ada alasan mengapa kesalahan tunggal dikembalikan dengan metode bawahan kembali tidak boleh ditangani. Dan kesalahan dan pengecualian hanya lebih dari nilai pengembalian atau semua try / catch.

  1. Hanya melempar dan menangkap saja tidak cukup.
    Lihat ini : di mana penulis menjelaskan bahwa hanya dengan menangkap tetapi tidak melakukan apa pun berpotensi menekan pengecualian dan kecuali cukup dilakukan untuk membatalkan kerusakan - itu lebih buruk daripada membiarkan kode pergi begitu saja. Demikian pula hanya menulis pernyataan "log" ketika ada file yang terbuka atau kesalahan baca mungkin membantu menemukan alasan mengapa - tetapi pada saat program berakhir, itu mungkin telah menyebabkan data menjadi rusak! Tidaklah cukup untuk mengatakan bahwa saya memiliki banyak percobaan / tangkapan - lebih penting untuk mengetahui apa yang sebenarnya mereka lakukan!

  2. Jangan menyalahgunakan coba dan tangkap.
    Beberapa kali - kebanyakan programmer yang malas atau naif berpikir bahwa setelah menulis try / catch yang cukup, pekerjaan mereka selesai dan mudah. Cukup sering yang terbaik adalah menerapkan tindakan korektif dan melanjutkan daripada hanya membuang semuanya. Jika ini tidak dapat dilakukan, seseorang perlu memutuskan pada level apa Anda harus kembali. Tergantung pada konteks dan tingkat keparahannya, coba tangkap kebutuhan bersarang desain yang cermat. Misalnya- Lihat ini dan ini

  3. Tentukan siapa yang bertanggung jawab:
    Salah satu hal pertama yang harus Anda lakukan adalah menentukan apakah input yang diberikan ke rutin itu sendiri hanya skenario yang tidak dapat diterima (atau tidak ditangani sejauh ini) atau merupakan pengecualian karena lingkungan (seperti masalah sistem, masalah memori), atau Apakah situasi ini sepenuhnya internal yang timbul dari hasil algoritma. Dalam semua kasus - tingkat di mana Anda mungkin ingin kembali atau tindakan yang ingin Anda ambil berbeda secara signifikan. Dalam hal ini saya ingin mengatakan - bahwa ketika Anda menjalankan kode dalam pembuatan - batalkan () untuk keluar dari program itu baik - tetapi tidak untuk setiap hal kecil. Jika Anda melihat memori rusak atau kehabisan memori, sudah pasti bahwa bahkan setelah melakukan yang terbaik - semuanya akan mati. Tetapi jika Anda menerima pointer NULL pada input - saya tidak akan

  4. Tetapkan apa hasil terbaik yang mungkin:
    Apa yang harus dilakukan dengan pengecualian sangat penting. Misalnya jika dalam salah satu kasus kami - pemutar media menemukan bahwa ia tidak memiliki data lengkap yang dapat dimainkan oleh pengguna - apa yang harus dilakukan?

    • baik melewati beberapa bagian buruk dan melihat apakah itu bisa maju dengan hal-hal baik
    • jika ini terjadi terlalu banyak, pertimbangkan apakah bisa lompat ke lagu berikutnya.
    • jika ternyata tidak dapat membaca file apa pun - berhenti dan tampilkan sesuatu.
    • sementara itu
    • di bawah negara mana pemain harus POP-UP ke pengguna dan
    • kapan itu harus dilakukan sendiri?
    • Haruskah "menghentikan" hal-hal untuk meminta umpan balik pengguna
    • atau haruskah itu menaruh sedikit kesalahan catatan kecil di beberapa sudut?

    Semua ini bersifat subyektif - dan mungkin ada lebih banyak cara untuk menangani masalah daripada yang kita anggap remeh. Semua hal di atas membutuhkan untuk membangun dan memahami kedalaman pengecualian dan kemudian membuat skenario yang berbeda untuk berkembang.

  5. Terkadang kita perlu memeriksa pengecualian sebelum muncul. Contoh paling umum adalah kesalahan divide by zero. Idealnya seseorang harus menguji bahwa sebelum pengecualian semacam itu dilemparkan ke atas - dan jika itu masalahnya - cobalah untuk menempatkan nilai bukan nol yang paling tepat dan maju terus daripada bunuh diri!

  6. Membersihkan. Setidaknya inilah yang harus Anda lakukan! Jika suatu fungsi terjadi untuk membuka 3 file dan yang keempat gagal untuk membuka - tidak perlu dikatakan 3 yang pertama harus ditutup. Mendelegasikan pekerjaan ini ke lapisan di atas adalah ide yang buruk. jika Anda memutuskan untuk tidak pergi tanpa membersihkan memori. Dan yang paling penting - bahkan jika Anda telah selamat dari pengecualian, informasikan kepada atasan bahwa hal-hal belum berjalan normal.

Cara kita melihat fungsionalitas (normal) perangkat lunak dalam hal berbagai hierarki atau lapisan atau abstraksi, cara yang sama kita harus mengkategorikan pengecualian berdasarkan tingkat keparahannya serta ruang lingkup di mana mereka muncul dan mereka mempengaruhi bagian lain dari sistem - yang mendefinisikan bagaimana menangani pengecualian yang berbeda sedemikian rupa dengan cara terbaik.

Referensi terbaik: Code Craft bab 6 - tersedia untuk diunduh

Dipan Mehta
sumber
1

Memeriksa kesalahan selama debug hanya build adalah BAD IDEA (tm), mengkompilasi di bawah rilis, overlay variabel yang dapat digunakan kembali pada stack, menghapus halaman penjaga, melakukan trik rapuh dengan perhitungan, mengganti artritis berat dengan shift yang dikomputasi dan sebagainya.

Gunakan pemeriksaan kesalahan dalam rilis juga, Anda dapat menggunakan sesuatu yang sederhana seperti:

if(somethinghitthefan)
     abort();

Ini juga memiliki efek samping yang sangat baik sehingga Anda pasti tidak akan mengabaikan bug begitu aplikasi mulai macet di PC penguji betta.

Pemirsa acara dan log sama sekali tidak berguna dibandingkan abort(), siapa yang memeriksanya?

Coder
sumber
keluar / batalkan == pengalaman pengguna terburuk yang pernah ada: aplikasi menghilang begitu saja tanpa memberi tahu alasannya ..
stijn
@stijn: abortmasuk ke debugger / membuat dump. exititu buruk, ya. Meskipun, saya __asm int 3paling suka .
Coder
itu benar, dan dalam C / C ++ saya cenderung menulis menegaskan menggunakan __asm ​​int 3 juga, tetapi tidak pernah tanpa menunjukkan setidaknya deskripsi mengapa, dan lebih disukai juga baris dan file. Maka setidaknya pelanggan dapat memberikan info tentang apa yang terjadi sebenarnya.
stijn
0

Berbagai hal yang dapat Anda lakukan adalah
1. Baca dan berasimilasi banyak kode online dan lihat bagaimana hal itu dilakukan
2. Gunakan beberapa alat debugging untuk membantu Anda menemukan daerah kesalahan
3. Waspadai kesalahan sepele karena penugasan yang tidak tepat dan kesalahan sintaksis.
4. Beberapa kesalahan yang lebih buruk muncul karena kesalahan logis dalam program yang lebih sulit ditemukan. Untuk ini, Anda dapat mengeluarkannya dan mencari atau untuk yang lebih rumit mencoba berbicara kepada orang atau menggunakan sumber daya seperti Stackoverflow , Wikipedia , google untuk mendapatkan bantuan dari orang-orang.

DCV
sumber