Golang 子线程错误捕获与打印:使用 defer 和 recover
Golang 子线程错误捕获与打印:使用 defer 和 recover
在 Golang 的 main 函数中,你可能会启动一个子线程来执行某些任务。当这个子线程发生错误时,你可能希望能够捕获并打印出错误信息。使用 defer 和 recover 可以实现这个功能。
问题描述:
假设你的 main 函数中包含如下代码,用于启动一个截图子线程:
go func() {
log.Println('截图子线程运行中...')
for running {
monkey.Device.Screenshot_continuous(&monkey.White_scr, &monkey.Black_scr,
&monkey.White_time, &monkey.Black_time, &monkey.Pic_count, &monkey.White_time_temp, &monkey.Black_time_temp)
time.Sleep(200 * time.Millisecond)
}
log.Println('截图子线程已退出!')
}()
当这个子线程出现错误时,你无法直接捕获到错误信息。
解决方案:
可以使用 defer 和 recover 来捕获子线程中的 panic,并打印出错误信息。修改后的代码如下:
go func() {
defer func() {
if err := recover(); err != nil {
log.Println('截图子线程发生错误:', err)
}
}()
log.Println('截图子线程运行中...')
for running {
monkey.Device.Screenshot_continuous(&monkey.White_scr, &monkey.Black_scr,
&monkey.White_time, &monkey.Black_time, &monkey.Pic_count, &monkey.White_time_temp, &monkey.Black_time_temp)
time.Sleep(200 * time.Millisecond)
}
log.Println('截图子线程已退出!')
}()
解释:
- defer:
defer关键字用于延迟执行一个函数。在这个例子中,我们使用defer来延迟执行一个匿名函数,这个匿名函数会在子线程退出时执行。 - recover:
recover函数用于捕获panic。当子线程发生panic时,recover函数会被调用,并返回导致panic的错误信息。
通过 defer 和 recover,我们可以在子线程发生 panic 时捕获错误,并将其打印出来,方便我们定位问题。
原文地址: https://www.cveoy.top/t/topic/mGRB 著作权归作者所有。请勿转载和采集!