Bahasa Go menyediakan mekanisme pengendalian ralat berikut: Tangani ralat secara terus: semak pembolehubah ralat dalam badan fungsi. Gunakan tangguh: Jalankan kod apabila fungsi keluar, tidak kira sama ada fungsi kembali normal atau ralat, untuk membersihkan sumber atau mencetak mesej ralat. Gunakan pulih: Tangkap panik masa jalan, biasanya disebabkan oleh ralat yang tidak dikendalikan. Jenis tersuai dan pembalut ralat: Buat jenis ralat tersuai dan balut ralat lain menggunakan fungsi ralat.Is dan ralat.Sebagai, membenarkan penegasan jenis.
Bahasa Go menyediakan mekanisme pengendalian ralat yang berkuasa, membolehkan pembangun mengendalikan ralat dengan cara yang jelas dan bersatu. Artikel ini akan memperkenalkan strategi berbeza untuk pengendalian ralat dalam Go dan menunjukkannya melalui kes praktikal.
Dalam Go, nilai ralat diwakili oleh antara muka error
, yang hanya jenis yang melaksanakan kaedah Error()
. Nilai ralat biasanya dibuat melalui fungsi nil
atau errors.New()
. Begini cara untuk mentakrif dan mengembalikan nilai ralat: error
接口表示,它只是一个实现了 Error()
方法的类型。错误值通常通过 nil
或 errors.New()
函数来创建。以下是如何定义和返回一个错误值:
func myFunction() error { return errors.New("error message") }
最简单的方法是直接处理错误,方法是在函数体中检查 err
变量:
func main() { if err := myFunction(); err != nil { log.Println(err) } }
defer
defer
语句允许在函数退出时执行代码,无论该函数是否返回正常或错误。这可以用于清理资源或打印错误消息:
func main() { defer func() { if err := recover(); err != nil { log.Println(err) } }() myFunction() }
recover
recover
函数可以捕获运行时恐慌,它通常是由未处理的错误引起的。可以通过在 main
函数中调用 recover
来处理未处理的错误:
func main() { if err := recover(); err != nil { log.Println(err) } myFunction() }
对于复杂场景,可以创建自定义错误类型并使用 errors.Is
和 errors.As
函数包装其他错误。这允许在错误层次结构中进行类型断言:
type MyError struct { error } func main() { if err := myFunction(); err != nil { if myError, ok := err.(MyError); ok { log.Println(myError) } else { log.Println(err) } } }
考虑一个需要连接到数据库并执行查询的应用程序。应用程序可以按照以下方式处理错误:
func main() { db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database") if err != nil { log.Fatal(err) } defer db.Close() rows, err := db.Query("SELECT * FROM table") if err != nil { log.Println(err) return } defer rows.Close() for rows.Next() { var name string if err := rows.Scan(&name); err != nil { log.Println(err) continue } log.Println(name) } }
应用程序使用 defer
rrreee
err
dalam badan fungsi: 🎜rrreee🎜Gunakan tunda
🎜🎜 tunda
pernyataan membenarkan kod dilaksanakan apabila fungsi keluar, tidak kira sama ada fungsi itu kembali normal atau ralat. Ini boleh digunakan untuk membersihkan sumber atau mencetak mesej ralat: 🎜rrreee🎜Gunakan fungsi recover
🎜🎜recover
untuk menangkap panik masa jalanan, yang biasanya disebabkan oleh ralat yang tidak dikendalikan . Ralat yang tidak dikendalikan boleh dikendalikan dengan memanggil recover
dalam fungsi utama
: 🎜rrreee🎜Jenis tersuai dan pembungkusan ralat🎜🎜Untuk senario yang rumit, jenis ralat tersuai boleh dibuat Dan balut yang lain ralat menggunakan fungsi errors.Is
dan errors.As
. Ini membenarkan penegasan jenis dalam hierarki ralat: 🎜rrreee🎜 Contoh Praktikal 🎜🎜 Pertimbangkan aplikasi yang perlu menyambung ke pangkalan data dan melaksanakan pertanyaan. Aplikasi boleh mengendalikan ralat seperti berikut: 🎜rrreee🎜 Aplikasi menggunakan pernyataan tunda
untuk memastikan pangkalan data dan pengendalian pertanyaan ditutup dengan betul apabila ralat ditemui. Ia juga menggunakan pengendalian ralat langsung untuk mencetak mesej ralat dan meneruskan pemprosesan untuk mengelakkan gangguan keseluruhan aplikasi disebabkan oleh ralat tunggal. 🎜Atas ialah kandungan terperinci Strategi pengendalian ralat untuk fungsi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!