Rumah >pembangunan bahagian belakang >Golang >Kemahiran mengendalikan ralat dalam fungsi golang

Kemahiran mengendalikan ralat dalam fungsi golang

WBOY
WBOYasal
2024-05-04 22:06:01792semak imbas

Petua pengendalian ralat dalam fungsi Golang: Gunakan ralat.Ralat() untuk menukar ralat kepada rentetan. Gunakan Printf untuk memformat mesej ralat. Gunakan bungkus untuk menambah ringkasan ralat. Tentukan jenis ralat tersuai untuk menangkap ralat pendua. Gunakan fungsi bungkus untuk mengendalikan ralat dalam respons API.

Kemahiran mengendalikan ralat dalam fungsi golang

Kemahiran pengendalian ralat dalam fungsi Golang

Bahasa Go menyediakan mekanisme pengendalian ralat yang kaya yang boleh membantu kami menulis kod yang mantap dan boleh dipercayai. Artikel ini akan merangkumi teknik yang berbeza untuk mengendalikan ralat dalam fungsi Golang, bersama-sama dengan contoh.

error.Error()

Cara paling mudah ialah menggunakan error.Error() untuk menukar mesej ralat kepada rentetan. error.Error() 将错误信息转换为字符串。

func f() error {
    return errors.New("some error")
}

func main() {
    err := f()
    if err != nil {
        fmt.Println(err.Error()) // 输出: some error
    }
}

Printf

对于更复杂的错误,我们可以使用 Printf 来格式化错误消息。

func f() error {
    return fmt.Errorf("cannot open file: %s", filename)
}

func main() {
    err := f()
    if err != nil {
        fmt.Println("Error:", err) // 输出: Error: cannot open file: filename
    }
}

wrap

wrap 函数可以在现有错误之上添加一层摘要。

func f() error {
    err := os.OpenFile("filename", os.O_RDWR, 0666) // 可能抛出错误
    return errors.Wrap(err, "failed to open file")
}

func main() {
    err := f()
    if err != nil {
        fmt.Println("Error:", err) // 输出: Error: failed to open file: filename
                                    // 同时包含底层错误信息
    }
}

自定义错误类型

对于重复发生的错误,我们可以定义自定义错误类型。

type FileOpenError struct {
    path string
    err  error
}

func (e *FileOpenError) Error() string {
    return fmt.Sprintf("cannot open file: %s: %v", e.path, e.err)
}

func f() error {
    err := os.OpenFile("filename", os.O_RDWR, 0666)
    if err != nil {
        return &FileOpenError{path: "filename", err: err}
    }
    return nil
}

func main() {
    err := f()
    if err != nil {
        if casted, ok := err.(*FileOpenError); ok {
            fmt.Println("Error:", casted.Error()) // 输出: cannot open file: filename: open filename: permission denied
        }
    }
}

实战案例

以下是一个使用 wrap

func apiCall() error {
    resp, err := http.Get("https://example.com/api")
    if err != nil {
        return errors.Wrap(err, "failed to make API call")
    }
    defer resp.Body.Close()
    ... // 处理响应
}

func main() {
    err := apiCall()
    if err != nil {
        fmt.Println("Error:", err) // 输出: Error: failed to make API call: Get https://example.com/api: dial tcp: lookup example.com on 8.8.8.8:53: no such host
    }
}

Printf

🎜🎜Untuk ralat yang lebih kompleks, kita boleh menggunakan Printf untuk memformat mesej ralat. 🎜rrreee🎜🎜wrap🎜🎜🎜 Fungsi wrap menambah lapisan ringkasan di atas ralat sedia ada. 🎜rrreee🎜🎜Jenis ralat tersuai🎜🎜🎜Untuk ralat berulang, kami boleh menentukan jenis ralat tersuai. 🎜rrreee🎜🎜Kes praktikal🎜🎜🎜Berikut ialah contoh tindak balas API menggunakan fungsi wrap untuk mengendalikan ralat: 🎜rrreee🎜Dengan menggunakan teknik pengendalian ralat ini, kami boleh memastikan fungsi Golang dibentangkan dalam cara yang jelas dan mudah difahami. 🎜

Atas ialah kandungan terperinci Kemahiran mengendalikan ralat dalam fungsi golang. 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