Saya tidak yakin mengapa kita perlu finally
dalam try...except...finally
pernyataan. Menurut pendapat saya, blok kode ini
try:
run_code1()
except TypeError:
run_code2()
other_code()
sama dengan yang ini menggunakan finally
:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Apakah saya melewatkan sesuatu?
Anda dapat menggunakan
finally
untuk memastikan file atau sumber daya ditutup atau dirilis terlepas dari apakah pengecualian terjadi, bahkan jika Anda tidak menangkap pengecualian. (Atau jika Anda tidak menangkap pengecualian spesifik itu .)Dalam contoh ini Anda akan lebih baik menggunakan
with
pernyataan, tetapi struktur semacam ini dapat digunakan untuk jenis sumber daya lainnya.Beberapa tahun kemudian, saya menulis posting blog tentang penyalahgunaan
finally
yang menurut pembaca lucu.sumber
Mereka tidak setara. Akhirnya kode dijalankan apa pun yang terjadi. Ini berguna untuk kode pembersihan yang harus dijalankan.
sumber
Finally code is run no matter what else happens
... kecuali ada loop tak terbatas. Atau steker listrik. Atauos._exit()
. Atau ...os._exit
.Untuk menambah jawaban lain di atas,
finally
klausa mengeksekusi tidak peduli apa sedangkanelse
klausa mengeksekusi hanya jika pengecualian tidak dimunculkan.Misalnya, menulis ke file tanpa pengecualian akan menghasilkan yang berikut:
KELUARAN:
Jika ada pengecualian, kode akan menampilkan yang berikut, (perhatikan bahwa kesalahan yang disengaja disebabkan oleh menjaga file hanya-baca.
KELUARAN:
Kita bisa melihat bahwa
finally
klausa dieksekusi terlepas dari pengecualian. Semoga ini membantu.sumber
else
apa-apa. Berguna untuk tahu.Blok kode tidak setara. The
finally
klausul juga akan dijalankan jikarun_code1()
melempar pengecualian selainTypeError
, atau jikarun_code2()
melempar pengecualian, sedangkanother_code()
pada versi pertama tidak akan dijalankan dalam kasus ini.sumber
Dalam contoh pertama Anda, apa yang terjadi jika
run_code1()
memunculkan pengecualian yang tidakTypeError
? ...other_code()
tidak akan dieksekusi.Bandingkan dengan
finally:
versi:other_code()
dijamin akan dieksekusi terlepas dari segala pengecualian yang diajukan.sumber
Sebagaimana dijelaskan dalam dokumentasi ,
finally
klausa ini dimaksudkan untuk mendefinisikan tindakan pembersihan yang harus dijalankan dalam semua keadaan .Sebuah contoh:
Seperti yang Anda lihat,
finally
klausa dieksekusi dalam peristiwa apa pun. TheTypeError
mengangkat dengan membagi dua string tidak ditangani olehexcept
klausa dan karena itu kembali mengangkat setelahfinally
klausul telah dieksekusi.Dalam aplikasi dunia nyata, klausa terakhir berguna untuk melepaskan sumber daya eksternal (seperti file atau koneksi jaringan), terlepas dari apakah penggunaan sumber daya berhasil.
sumber
Contoh sempurna adalah sebagai berikut:
sumber
finally
adalah untuk mendefinisikan "tindakan pembersihan" . Thefinally
klausul dijalankan dalam setiap peristiwa sebelum meninggalkantry
pernyataan, apakah pengecualian (bahkan jika Anda tidak menanganinya) telah terjadi atau tidak.Saya beri contoh @ Byers.
sumber
Akhirnya dapat juga digunakan ketika Anda ingin menjalankan kode "opsional" sebelum menjalankan kode untuk pekerjaan utama Anda dan bahwa kode opsional mungkin gagal karena berbagai alasan.
Dalam contoh berikut, kami tidak tahu persisnya pengecualian apa yang
store_some_debug_info
mungkin muncul.Kita bisa lari:
Tapi, sebagian besar linter akan mengeluh tentang menangkap pengecualian yang terlalu kabur. Juga, karena kami memilih hanya
pass
untuk kesalahan,except
blok tidak benar-benar menambah nilai.Kode di atas memiliki efek yang sama dengan blok kode 1 tetapi lebih ringkas.
sumber
Menggunakan delphi secara profesional selama beberapa tahun mengajarkan saya untuk menjaga rutinitas pembersihan saya menggunakan akhirnya. Delphi cukup banyak memberlakukan penggunaan akhirnya untuk membersihkan semua sumber daya yang dibuat sebelum blok coba, jangan sampai Anda menyebabkan kebocoran memori. Ini juga cara kerja Java, Python dan Ruby.
dan sumber daya akan dibersihkan terlepas dari apa yang Anda lakukan antara mencoba dan akhirnya. Juga, itu tidak akan dibersihkan jika eksekusi tidak pernah mencapai
try
blok. (Yaitucreate_resource
sendiri melempar pengecualian) Itu membuat kode Anda "pengecualian aman".Mengapa Anda benar-benar membutuhkan blokir terakhir, tidak semua bahasa membutuhkannya. Di C ++ di mana Anda secara otomatis memanggil destructors yang memberlakukan pembersihan ketika pengecualian membuka gulungan stack. Saya pikir ini adalah langkah maju menuju kode bersih dibandingkan dengan mencoba ... akhirnya bahasa.
sumber
Blok percobaan hanya memiliki satu klausa wajib: Pernyataan percobaan. Klausa kecuali, yang lain, dan terakhir adalah opsional dan didasarkan pada preferensi pengguna.
akhirnya: Sebelum Python meninggalkan pernyataan coba, itu akan menjalankan kode di blok akhirnya dalam kondisi apa pun, bahkan jika itu mengakhiri program. Misalnya, jika Python mengalami kesalahan saat menjalankan kode di blok kecuali atau yang lain, blok akhirnya masih akan dieksekusi sebelum menghentikan program.
sumber
Jalankan kode Python3 ini untuk melihat kebutuhan akhirnya:
KASUS 1:
CASE2:
Coba input berikut ini setiap kali:
** Pada tahap awal pembelajaran Python.
sumber
Saya mencoba menjalankan kode di mana saya ingin membaca lembar excel. Masalahnya adalah, jika ada file yang tidak memiliki sheet bernama say: SheetSum Saya tidak dapat memindahkannya ke lokasi kesalahan !! Kode yang saya tulis adalah:
Memberi kesalahan:
Saya harus menambahkan
try except with finally
blok penuh dan memberi tahufinally
saya harus menutup file dalam hal apa pun seperti:Jika tidak, file tetap terbuka adalah latar belakang.
..Lebih Di Sini
sumber