Golang 子线程错误捕获与打印:使用 defer 和 recover

在 Golang 的 main 函数中,你可能会启动一个子线程来执行某些任务。当这个子线程发生错误时,你可能希望能够捕获并打印出错误信息。使用 deferrecover 可以实现这个功能。

问题描述:

假设你的 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('截图子线程已退出!')
}()

当这个子线程出现错误时,你无法直接捕获到错误信息。

解决方案:

可以使用 deferrecover 来捕获子线程中的 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('截图子线程已退出!')
}()

解释:

  1. defer: defer 关键字用于延迟执行一个函数。在这个例子中,我们使用 defer 来延迟执行一个匿名函数,这个匿名函数会在子线程退出时执行。
  2. recover: recover 函数用于捕获 panic。当子线程发生 panic 时,recover 函数会被调用,并返回导致 panic 的错误信息。

通过 deferrecover,我们可以在子线程发生 panic 时捕获错误,并将其打印出来,方便我们定位问题。

Golang 子线程错误捕获与打印:使用 defer 和 recover

原文地址: https://www.cveoy.top/t/topic/mGRB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录