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.
sumber
setjmp
/longjmp
tersedia dalam C, jadi Anda tidak perlu bahasa baru.Jawaban:
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.
sumber
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".
sumber
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.
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!
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
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
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?
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.
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!
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
sumber
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:
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?sumber
abort
masuk ke debugger / membuat dump.exit
itu buruk, ya. Meskipun, saya__asm int 3
paling suka .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.
sumber