Terdapat dua cara untuk menangani ralat dalam penangguhan dalam Go: 1. Buat jenis ralat tersuai untuk menangkap ralat 2. Gunakan recover() untuk menangkap panik. Contohnya, menggunakan recover() untuk menangkap ralat dalam penangguhan boleh ditulis seperti ini: defer func() { if err := recover();
Di Golang, pernyataan defer
digunakan untuk memastikan operasi dalam fungsi dilaksanakan serta-merta selepas fungsi kembali, tanpa mengira sama ada pengecualian berlaku. Walau bagaimanapun, jika ralat berlaku semasa pelaksanaan fungsi tunda
, ralat ini biasanya diabaikan. defer
语句用于确保函数中的操作在函数返回后立即执行,无论是否发生异常。然而,如果在 defer
函数执行期间发生错误,则这些错误通常会被忽略。
要处理 defer
期间的错误,有两种主要方法:
一种方法是创建一个自定义错误类型来捕获 defer
函数的错误。例如:
import ( "fmt" ) type DeferError struct { err error } func (e DeferError) Error() string { return fmt.Sprintf("Defer error: %v", e.err) }
recover()
另一种方法是使用 recover()
来捕获 defer
函数中发生的恐慌。例如:
import "fmt" func main() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() panic("defer error") }
考虑以下示例:
import ( "fmt" "os" ) func writeToFile(filename string) { defer os.Remove(filename) // 删除文件 f, err := os.Create(filename) if err != nil { panic(fmt.Sprintf("Error creating file: %v", err)) } // 执行 IO 操作 ... }
在这个示例中,defer
函数用于确保在函数返回后删除文件。但是,如果文件创建失败 (os.Create
出错),defer
函数将无法执行,因为函数会提前返回。
要捕获这个错误,我们可以使用以下方法:
func writeToFile(filename string) { defer func() { if err := recover(); err != nil { fmt.Println(err) } os.Remove(filename) // 删除文件 }() f, err := os.Create(filename) if err != nil { panic(fmt.Sprintf("Error creating file: %v", err)) } // 执行 IO 操作 ... }
现在,如果文件创建失败,defer
recover()
recover()
untuk menangkap tunda
fungsi panik. Contohnya: 🎜rrreeetunda
digunakan untuk memastikan fail dipadamkan selepas fungsi kembali . Walau bagaimanapun, jika penciptaan fail gagal (ralat os.Create
), fungsi defer
tidak akan dilaksanakan kerana fungsi akan kembali awal. 🎜🎜Untuk menangkap ralat ini, kita boleh menggunakan kaedah berikut: 🎜rrreee🎜Kini, jika penciptaan fail gagal, fungsi tunda
masih akan dilaksanakan kerana ia tidak membuang pengecualian. 🎜Atas ialah kandungan terperinci Bagaimana untuk mengendalikan ralat yang berlaku semasa penangguhan di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!