Dalam coretan kod Go yang diberikan, panik berlaku dalam sub( ) fungsi. Fungsi tertunda di dalam sub() kemudian panik sekali lagi, dengan nilai yang berbeza. Persoalannya, adakah dibenarkan panik dalam fungsi penangguhan, terutamanya apabila program sudah panik?
Ya, panik dalam fungsi penangguhan boleh diterima, walaupun semasa panik sedia ada. Panik daripada fungsi tertunda tidak memulakan keadaan unik atau luar biasa; ia hanya memanjangkan urutan panik.
Contoh kod yang disediakan menunjukkan bahawa panik daripada fungsi penangguhan adalah tidak berbahaya malah membolehkan pemulihan menggunakan recover() pada tahap yang lebih tinggi.
Mengikut spesifikasi Go mengenai Pengendalian Panik:
"Jika fungsi pada panik goroutine yang sama, fungsi tertunda akan berjalan dalam susunan yang sama seperti yang ditangguhkan, dengan fungsi tertunda paling luar (yang dipanggil terakhir) berjalan dahulu. Jika sebarang panggilan fungsi tertunda pulih dan panik berlaku di mana-mana dalam goroutine, nilai yang diluluskan untuk pulih akan menjadi nilai yang dihantar kepada panggilan awal untuk panik."
Walaupun dibenarkan panik dalam fungsi penangguhan, adalah penting untuk ambil perhatian bahawa:
Contoh berikut menggambarkan tingkah laku ini:
<code class="go">func main() { defer func() { fmt.Println("Checkpoint 1"); panic(1) }() defer func() { fmt.Println("Checkpoint 2"); panic(2) }() panic(999) }</code>
Output:
Checkpoint 2 Checkpoint 1 panic: 999 panic: 2 panic: 1
Semua fungsi tertunda dilaksanakan dan nilai yang dihantar kepada semua panggilan panik() disertakan dalam urutan panik akhir.
Panik dalam fungsi penangguhan, walaupun semasa panik sedia ada, boleh diterima dalam Go. Walau bagaimanapun, adalah penting untuk mengetahui susunan dan akibat pelaksanaan fungsi tertunda, dan menggunakan recover() dengan sewajarnya untuk menangani panik.
Atas ialah kandungan terperinci Bolehkah Anda Panik Di Dalam Fungsi Tangguh Semasa Panik Sedia Ada dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!