Apa pun yang ada di dalam akhirnya blok dieksekusi (hampir) selalu, jadi apa perbedaan antara memasukkan kode ke dalamnya atau membiarkannya tidak tertutup?
c#
exception-handling
Rodrigo
sumber
sumber
Jawaban:
Kode di dalam blok akhirnya akan dieksekusi terlepas dari apakah ada pengecualian atau tidak. Ini sangat berguna ketika datang ke fungsi rumah tangga tertentu yang Anda harus selalu jalankan seperti menutup koneksi.
Sekarang, saya menduga pertanyaan Anda adalah mengapa Anda harus melakukan ini:
Kapan Anda bisa melakukan ini:
Jawabannya adalah bahwa sering kali kode di dalam pernyataan tangkap Anda akan rethrow pengecualian atau keluar dari fungsi saat ini. Dengan kode yang terakhir, "alwaysDoThis ();" panggilan tidak akan dieksekusi jika kode di dalam pernyataan hasil tangkapan mengembalikan atau melempar pengecualian baru.
sumber
Sebagian besar keuntungan menggunakan try-akhirnya sudah ditunjukkan, tapi saya pikir saya akan menambahkan yang ini:
Perilaku ini membuatnya sangat berguna dalam berbagai situasi, terutama ketika Anda perlu melakukan pembersihan (membuang sumber daya), meskipun blok penggunaan sering lebih baik dalam kasus ini.
sumber
kapan saja Anda menggunakan permintaan kode yang tidak dikelola seperti pembaca aliran, permintaan db, dll; dan Anda ingin menangkap pengecualian kemudian gunakan try catch akhirnya dan tutup aliran, pembaca data, dll. pada akhirnya, jika Anda tidak melakukannya ketika kesalahan koneksi tidak bisa ditutup, ini benar-benar buruk dengan permintaan db
jika Anda tidak ingin menangkap kesalahan maka gunakan
dan objek koneksi akan dibuang secara otomatis jika ada kesalahan, tetapi Anda tidak menangkap kesalahan tersebut
sumber
Karena akhirnya akan dieksekusi bahkan jika Anda tidak menangani pengecualian di blok tangkap.
sumber
Akhirnya pernyataan dapat dieksekusi bahkan setelah kembali.
sumber
finally
, seperti dalam:adalah peluang yang dijamin untuk mengeksekusi kode setelah
try..catch
blok Anda , terlepas dari apakah Anda mencoba atau tidak melempar pengecualian.Itu membuatnya sempurna untuk hal-hal seperti melepaskan sumber daya, koneksi db, file menangani, dll.
sumber
saya akan menjelaskan penggunaan akhirnya dengan contoh pembaca file Contoh
dalam contoh di atas jika file bernama Data.txt hilang, pengecualian akan dibuang dan akan ditangani tetapi pernyataan yang dipanggil
StreamReader.Close();
tidak akan pernah dieksekusi.Karena sumber daya yang terkait dengan pembaca ini tidak pernah dirilis.
Selamat Coding :)
Catatan: "@" digunakan untuk membuat string kata demi kata , untuk menghindari kesalahan "Urutan keluar yang tidak dikenal". Simbol @ berarti membaca string itu secara harfiah, dan tidak menafsirkan karakter kontrol sebaliknya.
sumber
Katakanlah Anda perlu mengatur kursor kembali ke pointer default daripada kursor menunggu (jam pasir). Jika pengecualian dilemparkan sebelum mengatur kursor, dan tidak langsung crash aplikasi, Anda bisa dibiarkan dengan kursor membingungkan.
sumber
Terkadang Anda tidak ingin menangani pengecualian (tanpa blok tangkapan), tetapi Anda ingin beberapa kode pembersihan dijalankan.
Sebagai contoh:
sumber
Blok akhirnya berguna untuk membersihkan semua sumber daya yang dialokasikan dalam blok coba serta menjalankan kode apa pun yang harus dijalankan bahkan jika ada pengecualian. Kontrol selalu diteruskan ke blok akhirnya terlepas dari bagaimana blok coba keluar.
sumber
Ahh ... kurasa aku mengerti apa yang kamu katakan! Butuh waktu sebentar ... Anda bertanya-tanya "mengapa menempatkannya di blok akhirnya alih-alih setelah blok akhirnya dan benar-benar di luar try-catch-akhirnya".
Sebagai contoh, itu mungkin karena Anda menghentikan eksekusi jika Anda melakukan kesalahan, tetapi Anda masih ingin membersihkan sumber daya, seperti file yang terbuka, koneksi database, dll.
sumber
Aliran Kontrol Blok Akhirnya adalah setelah blok Coba atau Tangkap.
dengan Pengecualian 1> 2> 3> 4> 5 jika 3 memiliki pernyataan Pengembalian 1> 2> 3> 4
tanpa Pengecualian 1> 2> 4> 5 jika 2 memiliki pernyataan pengembalian 1> 2> 4
sumber
Seperti disebutkan dalam dokumentasi :
Perlu juga membaca ini , yang menyatakan:
Jadi jelas bahwa kode yang berada dalam
finally
klausa akan dieksekusi bahkan jikacatch
klausa sebelumnya memilikireturn
pernyataan.sumber