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
Linda Hamiltonasal
2024-11-14 12:10:02292semak imbas

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
    ...
}

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!

Kenyataan:
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