Bagaimana cara mengajar Penanganan Eksepsi untuk Programer Baru? [Tutup]

21

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.

  1. UILayer
  2. BusinessLayer
  3. 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?

Kanini
sumber
15
Jika Anda sedang akan melakukan itu, Anda tidak ingin catch (Exception ex) {throw ex; } - sebagai gantinya hanya menangkap {throw; }
Steven Evers
4
Mari kita tidak melupakan akhirnya blok?
Chris
1
Anda harus menentukan bahasa dalam tag. Anda masuk ke detail lebih daripada yang umum untuk sebagian besar implementasi pengecualian, dan mengabaikan hal-hal di luar blok. Dalam C ++, misalnya, bagian terpenting dari penanganan pengecualian adalah mengetahui cara menulis program pengecualian-aman.
David Thornley
Saya harap Anda tahu itu adalah ide yang buruk untuk menangkap "Pengecualian". Anda harus memiliki blok penangkap bersarang untuk menangkap pengecualian tertentu dan menanganinya sesuai (tidak hanya membuang pengecualian).
minusSeven

Jawaban:

29

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.

Mason Wheeler
sumber
4
Memberi +1 untuk "... karena tidak benar-benar menangani apa pun", orang yang baru menangani penanganan sehingga sering berpikir menangkap berarti menangani dan tidak menyadari jika Anda tidak melakukan sesuatu untuk memperbaiki masalah, itu bukan penanganan pengecualian, hanya kode mengasapi.
Jimmy Hoffa
13

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.

dsimcha
sumber
2
+1 untuk praktik mengajar memimpin mereka dalam kode pengembalian gaya C tradisional dan nomor kesalahan dan menunjukkan kepada mereka bahwa itu bekerja dengan buruk dan karena itu, mengajari mereka bagaimana itu akan bekerja adalah brilian!
Kanini
3
@ Kanini: Secara umum saya pikir konstruksi yang relatif baru / tingkat tinggi tampaknya seperti solusi dalam mencari masalah dan mudah salah digunakan jika Anda tidak mengerti masalah apa yang ingin mereka pecahkan dan mengapa mereka diciptakan.
dsimcha
Saya setuju bahwa menunjukkan bagaimana hal itu akan dilakukan tanpa pengecualian adalah baik, tetapi kemudian muncul beban untuk menjelaskan kapan harus menggunakan pengecualian dan kapan harus menggunakan teknik lain (karena tidak semua situasi luar biasa)
Matthieu M.
@ Matthieu: Benar. Tetapi jika Anda memahami apa yang dimaksud dengan perkecualian yang dimaksudkan untuk diselesaikan perkecualian, alih-alih mempelajarinya dalam ruang hampa, menjadi lebih jelas bahwa konyol menggunakannya untuk situasi yang tidak biasa.
dsimcha
benar, itu sebabnya Anda mendapat +1 saya. Saya hanya merasa jawaban Anda dapat ditafsirkan sebagai "tidak pernah menggunakan mekanisme lain" :)
Matthieu M.
5

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

//In DataLayer

try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
        throw new TransactionFileMissingException(
                     "Cannot Access System Information",ex);
}

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

Pertimbangkan untuk membungkus pengecualian khusus yang dilemparkan dari lapisan bawah dalam pengecualian yang lebih tepat, jika pengecualian lapisan bawah tidak masuk akal dalam konteks operasi lapisan yang lebih tinggi.

Jadi jika Anda merasa yang memiliki layer lebih tinggi harus tahu tentang file sama sekali maka layer data Anda akan terlihat seperti ini

//In DataLayer

XDocument xd_XmlDocument = XDocument.Load("systems.xml");

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 exdalam hal ini atau yang disukai throwtidak 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

  • ArgumentNullException
  • KeamananException
  • FileNotFoundException
  • UriFormatException

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.

 if (File.Exists("systems.xml")) 
     XDocument.Load("systems.xml");

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

Conrad Frix
sumber
Perbaiki: Terima kasih! Tetapi apakah benar untuk memiliki blok pengecualian ini di Layer Data? Haruskah semuanya memeriksa apakah File Tersedia atau Tidak di Lapisan Bisnis? Kalau tidak, saya setuju dengan metode penulisan kode Anda.
Kanini
Perbaiki: Dalam bahasa ibu saya, Kanini berarti Komputer sedangkan Kani berarti buah ;-)
Kanini
Saya tahu Anda tidak terlalu kesal dengan kesalahan saya, tetapi saya sangat menyesal dan saya telah memperbaikinya.
Conrad Frix
1
Perbaiki: Kesal? Tidak semuanya. Sangat terhibur. Saudaraku belum berhenti tertawa sejak aku menunjukkan ini kepadanya terutama karena, aku tidak menyerupai buah apa pun kecuali mungkin untuk bentuk aneh ...
Kanini
4

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.

Tim Williscroft
sumber
+1 untuk gagasan permainan peran. Kami tidak pernah memikirkannya sebelumnya. Siapa pun yang mengira pemrograman pemrograman dapat dilakukan melalui Role Play?
Kanini
1

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:

  • kami membuat koneksi
  • koneksi ok jadi kami menggunakannya
  • ketika selesai kita menutup dan sumber daya gratis

atau dalam kasus pengecualian:

  • membuat koneksi
  • pengecualian terjadi yang ditangani oleh sesuatu
  • pada titik mana kami membebaskan koneksi dan sumber daya yang terkait
Chris
sumber
1

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.

Kutu buku
sumber
Kedengaranya seperti sebuah rencana. Apakah Anda memiliki kode sampel yang tersedia di Internet (katakanlah, sourceforge.net) yang akan Anda rekomendasikan?
Kanini
0

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
@denny: Meskipun saya setuju dengan "penanganan pengecualian hanya akan bereaksi ketika kesalahan (atau pengecualian) terjadi", saya sangat tidak yakin tentang pernyataan bahwa "penanganan pengecualian dan pernyataan kontrol aliran pada dasarnya sama". Dengan hormat saya tidak setuju di sana. Tangkapan blok diakui melakukan apa yang harus dilakukan dalam kondisi itu. Namun blok try sama sekali bukan tentang aliran atau kontrol. Blok terakhir, sekali lagi sama sekali bukan tentang aliran atau kontrol. Mungkin, saya salah mengerti jawaban Anda, tetapi bisakah Anda mengklarifikasi untuk kepentingan saya dan orang lain?
Kanini
0

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.

CodexArcanum
sumber
0

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:

  • Data tidak ada
  • File tidak ada
  • Karakter alfa saat Anda mengharapkan angka
  • Pembagian dengan nol

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.

Michael Riley - AKA Gunny
sumber
Monyet? Saya kira, pengguna bisnis Anda tidak pernah mendengar itu ;-)
Kanini
@ Kanini - Bagus. Itu pada hari-hari Korps Marinir saya. Saya hanya ingin orang-orang saya berpikir di luar kotak ketika datang ke kesalahan menjebak. Apakah saya baru saja mengatakan kesalahan menjebak ... Maksud saya penanganan pengecualian.
Michael Riley - AKA Gunny