Bagaimana cara Anda mengajarkan Exception Handling kepada Programer. Semua hal lain diajarkan dengan mudah - Struktur Data, ASP.NET, WinForms, WPF, WCF - sebut saja, semuanya dapat diajarkan dengan mudah.
Dengan Exception Handling, mengajari mereka try-catch-akhirnya hanyalah sifat sintaksis dari Exception Handling.
Namun apa yang harus diajarkan adalah - Bagian mana dari kode Anda yang Anda masukkan ke dalam blok try ? Apa yang Anda lakukan di blok tangkap ?
Izinkan saya menggambarkannya dengan sebuah contoh.
Anda sedang mengerjakan Proyek Formulir Windows (utilitas kecil) dan Anda telah mendesainnya seperti di bawah ini dengan 3 proyek berbeda.
- UILayer
- BusinessLayer
- DataLayer
Jika Pengecualian (katakanlah memuat XDocument melempar pengecualian) dimunculkan di DataLayer (UILayer memanggil BusinessLayer yang kemudian memanggil DataLayer), lakukan saja hal berikut
//In DataLayer
try {
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(Exception ex)
{
throw ex;
}
yang akan dilemparkan lagi di BusinessLayer dan yang tertangkap di UILayer tempat saya menulisnya ke file log?
Apakah ini yang Anda lakukan tentang Penanganan Pengecualian?
Jawaban:
Untuk menjelaskan penanganan pengecualian, jelaskan konsep di baliknya: Kode di mana kesalahan sering terjadi tidak tahu bagaimana menangani dengan benar kesalahan itu. Kode yang tahu cara menanganinya dengan benar bisa berupa fungsi yang memanggil yang itu, atau bisa lebih jauh dari tumpukan panggilan.
Saat Anda menulis rutin yang memanggil rutin yang mungkin mengeluarkan pengecualian, jika Anda tahu cara menangani kesalahan itu dengan benar, letakkan panggilan di blok percobaan dan masukkan kode penanganan kesalahan di catch catch. Jika tidak, biarkan saja dan biarkan sesuatu di atas Anda di tumpukan panggilan menangani kesalahan.
Mengatakan "tangkap mantan, lempar bekas" bukanlah cara yang baik untuk melakukan penanganan pengecualian, karena ia tidak benar-benar menangani apa pun. Plus, tergantung pada bagaimana model pengecualian dalam bahasa Anda bekerja, itu sebenarnya bisa berbahaya jika menghapus tumpukan informasi jejak yang bisa Anda gunakan untuk men-debug masalah. Biarkan saja pengecualian menyebarkan tumpukan panggilan hingga mencapai rutin yang tahu bagaimana menanganinya.
sumber
Seperti kebanyakan hal, penanganan pengecualian dan pengecualian kemungkinan akan tampak seperti solusi dalam mencari masalah bagi programmer baru sampai Anda menunjukkan mengapa solusi yang tampaknya lebih sederhana (kode pengembalian C-style dan errno) bekerja sangat buruk. Saya akan mulai dengan memotivasi masalah dan menempatkannya dalam konteks. Tunjukkan bagaimana penanganan kesalahan dapat dilakukan menggunakan kode kembali atau variabel global / statis. Lalu berikan contoh mengapa itu tidak bekerja dengan baik. Kemudian dan hanya kemudian, perkenalkan pengecualian dan jelaskan bahwa itu adalah bentuk pensinyalan out-of-band dan bahwa intinya adalah bahwa perilaku default jika Anda mengabaikan pengecualian adalah meneruskan uang ke tumpukan panggilan ke seseorang yang bisa tangani itu.
Intinya: Menunjukkan bagaimana penanganan kesalahan dilakukan dalam C akan membuat siswa memahami apa pengecualian sebenarnya dan mengapa menangkap pengecualian yang tidak dapat Anda tangani pada dasarnya adalah mensimulasikan cara hal-hal dilakukan pada Abad Kegelapan.
sumber
Saya akan mulai dengan Pedoman Desain untuk Pengecualian yang singkat dan termasuk JANGAN, JANGAN, dan HINDARI. Itu juga memberi alasan mengapa.
Dalam contoh Anda, bagian revelvent akan menjadi Pengecualian Pembungkus
Dan akan berharap itu ditulis dengan cara ini. Perhatikan bahwa ia menangkap pengecualian khusus dan mencoba menambahkan informasi sehingga pesan yang lebih bermakna disebarkan. Perhatikan juga bahwa pengecualian dalam masih dipertahankan untuk tujuan logging
UPDATE Kanini bertanya apakah tepat untuk memiliki blok pengecualian ini di Layer Data atau harus memeriksa file yang tersedia untuk Business Layer.
Yah pertama-tama saya ingin menunjukkan bahwa alasan untuk Membungkus Pengecualian adalah ini
Jadi jika Anda merasa yang memiliki layer lebih tinggi harus tahu tentang file sama sekali maka layer data Anda akan terlihat seperti ini
Tidak Coba Tidak Menangkap.
Secara pribadi saya merasa bahwa kecuali lapisan data Anda dapat melakukan sesuatu yang berguna seperti menggunakan sistem default.xml yang merupakan sumber daya perakitan, tidak melakukan apa pun atau membungkus pengecualian adalah taruhan yang baik karena pencatatan Anda akan memberi tahu Anda metode apa dan file apa masalahnya. (
throw ex
dalam hal ini atau yang disukaithrow
tidak juga tetapi tidak menambah nilai). Ini berarti bahwa sekali teridentifikasi Anda akan dapat memperbaiki masalah dengan cepat.Sebagai contoh tambahan ini juga memiliki masalah berikut dalam XDocument.Load dapat membuang empat eksekusi
Kami tidak dapat dengan aman menjamin bahwa kode berikut tidak akan membuang dan FileNotFoundException, hanya karena bisa ada di sana ketika kami memeriksa keberadaan dan pergi ketika kami memuat. Memiliki yang tersedia untuk lapisan bisnis tidak akan membantu.
SecurityException bahkan lebih buruk karena di antara alasan lain untuk ini dilemparkan jika proses pengambilan lain memiliki kunci file eksklusif Anda tidak akan mendapatkan kesalahan sampai Anda mencoba membukanya untuk dibaca karena tidak ada metode File.CanIOpenThis (). Dan jika ada metode seperti itu, Anda masih memiliki masalah yang sama dengan File.Exists
sumber
Mari kita lakukan permainan peran. (ini bukan posting lelucon)
Anda harus melakukan lokakarya di mana Anda memerankan rantai panggilan. Setiap orang adalah objek. Anda akan membutuhkan beberapa pemula dan beberapa orang yang memahami "permainan" membantu.
Gunakan masalah yang sangat sederhana seperti file IO. gui-> model-> file_io
Orang yang menjadi pembaca file perlu memberi tahu yang berikutnya ....
Pertama lakukan dengan kode pengembalian. (gunakan post-it note?)
jika interaksi itu hanya "apa yang dikatakan kode" segera Anda dapat membuat orang menyadari bahwa pengecualian itu luar biasa.
untuk kode pengembalian, sampaikan catatan post-it.
untuk perkecualian, angkat tangan Anda dan katakan apa masalahnya.
kemudian suruh mereka melakukan "catch x, throw x" dan lihat jauh lebih buruk diagnosa yang didapat GUI "model memiliki pengecualian".
Saya pikir ini akan bekerja untuk melatih orang yang Anda miliki karena orang memahami interaksi dengan orang lain dengan cukup baik.
sumber
Saya akan membayangkan untuk memahami pengecualian, Anda harus terlebih dahulu memahami hubungan anak / orang tua dari kelas misalnya. Jika Anda memahami bahwa seorang anak dapat mewarisi fungsionalitas dari orang tua, mereka mungkin dapat pada tingkat dasar memahami bahwa jika seorang anak memiliki masalah, ia tidak dapat mengatasinya, akan meneruskan masalah ini (pengecualian) ke orang tuanya dan membiarkan orang tua berurusan. dengan itu.
Ini menjadi hubungan berantai sampai Anda berakhir dengan tempat di mana sesuatu tahu bagaimana menangani pengecualian.
Dan sejauh ini, ini adalah bagian yang sepele ... ketika masalah terjadi sesuatu harus menanganinya sehingga program tidak keluar secara fatal, setelah pengecualian itu ditangani, akhirnya ada blok yang akan selalu mengeksekusi terlepas dari try catch .
Contoh yang baik untuk hal ini mungkin dengan jaringan:
atau dalam kasus pengecualian:
sumber
Berikan Aplikasi kepada pemula yang memiliki penanganan Exception yang sangat baik di dalamnya. Lempar pengecualian di suatu tempat dan biarkan mereka men-debug-nya dengan bantuan Log. Dengan melacak propogasi Pengecualian, mereka seharusnya dapat men-debugnya. Lakukan latihan ini 3 atau 4 kali. Sekarang hapus saja semua penanganan Exception dari kode dan biarkan mereka mencoba melacak pengecualian yang sama.
Saya percaya apresiasi untuk kode Penanganan Pengecualian akan langsung dihargai.
sumber
IMO, Anda harus berpikir bahwa pernyataan penanganan dan kontrol aliran pada dasarnya sama. Anda menggunakannya untuk mengontrol aliran program Anda berdasarkan kondisi mereka saat ini. Perbedaannya adalah penanganan pengecualian hanya akan bereaksi ketika kesalahan (atau pengecualian) terjadi.
sumber
Mungkin tidak akan membantu programmer baru, tetapi saya menemukan bahwa saya memahami konsep pengecualian jauh lebih baik setelah saya mulai menggunakan monad dalam pemrograman fungsional. Monad memaksa Anda untuk mempertimbangkan setiap "saluran" di mana data dapat melakukan perjalanan ke atau keluar dari suatu program, karena semua yang dilakukannya itu memberikan abstraksi yang mudah untuk "menyembunyikan" sebagian aliran data itu.
Gagasan bahwa suatu fungsi dapat memiliki berbagai jenis keluaran, dan pengecualian seperti jenis pengembalian prioritas tinggi dari fungsi tersebut cukup rapi.
Pikiran Anda, saya mengerti itu bukan bagaimana pengecualian bekerja di sebagian besar bahasa (detail implementasi), tetapi dalam arti abstrak, itulah yang terjadi.
sumber
Pura-pura monyet menggunakan keyboard
Saya biasa memberi tahu teman-teman saya ketika mereka sedang menulis kode untuk berpura-pura bahwa monyet akan duduk di keyborad dan menggunakan aplikasi ini.
Ini mengajarkan mereka bagaimana mengantisipasi segala macam hal:
Saya pikir itu adalah gambar kata memiliki monyet yang hanya membenturkan kunci dan melakukan apa pun yang diinginkan daripada mengikuti dengan baik yang melakukan trik. Itu berhasil untuk saya.
sumber