Go: Handle Panic with Defer
Panik dan tangguh dalam Go menawarkan mekanisme untuk menangani ralat dan membersihkan sumber dengan anggun. Walau bagaimanapun, menggunakan penangguhan dan panik untuk pengendalian ralat memerlukan penjelasan.
Pertimbangkan kod berikut:
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err // Code 1 } }() panic("Report format not recognized.") // rest of the getReport function, which can try to out-of-bound-access a slice ... }
Niat di sini adalah untuk mengembalikan ralat jika fungsi panik. Walau bagaimanapun, fungsi tangguh menggunakan return nil, err (ditandakan sebagai Kod 1) untuk kembali daripada fungsi semasa. Ini bukan pendekatan yang betul.
Dalam fungsi tangguh, anda boleh mengubah suai parameter yang dikembalikan, tetapi anda tidak boleh mengembalikan set nilai baharu. Untuk membetulkannya, gantikan Kod 1 dengan:
rep = nil err = errors.New(r.(string)) return
Ini menetapkan ralat dengan betul dan membatalkan laporan.
Selain itu, penting untuk ambil perhatian bahawa nilai r yang dikembalikan oleh recover() ialah antara muka jenis{}. Dalam kod di atas, ia adalah jenis yang ditegaskan kepada ralat. Jika nilai panik bukan ralat, anda harus menggunakan penegasan jenis yang lebih sesuai atau mengendalikannya sebagai panik yang tidak diketahui.
Atas ialah kandungan terperinci Mengapakah `return nil, err` tidak betul dalam fungsi `defer` digunakan untuk pengendalian ralat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!