Menunda recover() lwn. defer recover()
Dalam Go, panik boleh ditangkap dan dikendalikan menggunakan fungsi recover() . Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa peletakan tangguh berbanding dengan panggilan recover() mempunyai implikasi yang ketara.
Senario A: defer func() { recover() }()
Dalam senario ini, penyata tangguh menjadualkan fungsi tanpa nama untuk dilaksanakan pada penghujung fungsi semasa. Apabila fungsi ini dilaksanakan, ia memanggil fungsi recover(). Ini ialah cara yang berkesan untuk menangkap dan mengendalikan panik kerana fungsi recover() akan dilaksanakan walaupun panik berlaku sebelum fungsi lampiran menyambung semula pelaksanaan.
Senario B: defer recover()
Dalam senario ini, fungsi recover() itu sendiri dijadualkan sebagai fungsi tertunda. Walau bagaimanapun, ini tidak berfungsi seperti yang dimaksudkan kerana recover() tidak memanggil dirinya sendiri. Oleh itu, sebarang panik yang berlaku sebelum fungsi lampiran menyambung semula pelaksanaan tidak akan ditangkap oleh panggilan tertunda ini.
Tingkah laku ini didokumenkan dalam dokumentasi Go: "Jika pemulihan dipanggil di luar fungsi tertunda, ia tidak akan menghentikan a urutan panik."
Contoh Menarik: defer (func() { recover() })()
Untuk menggambarkan perkara ini dengan lebih lanjut, pertimbangkan kod berikut:
var recover = func() { recover() } defer recover() panic("panic")
Anehnya, kod ini juga tidak panik. Dalam kes ini, kami mencipta pembolehubah pulih jenis fungsi dan memulakannya kepada fungsi tanpa nama yang memanggil recover() terbina dalam. Kami kemudiannya menentukan nilai pembolehubah pulih sebagai fungsi tertunda. Ini membolehkan kami menangkap dan mengendalikan panik kerana fungsi tertunda secara berkesan memanggil recover(), menghentikan urutan panik.
Atas ialah kandungan terperinci Pergi Pemulihan Panik: Menangguhkan `recover()` – Apakah Perbezaannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!