Rumah > pembangunan bahagian belakang > Golang > Mengapakah `return nil, err` tidak betul dalam fungsi `defer` digunakan untuk pengendalian ralat dalam Go?

Mengapakah `return nil, err` tidak betul dalam fungsi `defer` digunakan untuk pengendalian ralat dalam Go?

Linda Hamilton
Lepaskan: 2024-11-14 12:10:02
asal
261 orang telah melayarinya

Why is `return nil, err` incorrect in a `defer` function used for error handling in Go?

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
    ...
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan