Golang 协程和恢复(recover)
package main
import (
"fmt"
"time"
)
func worker(id int, sleepTime time.Duration) {
defer func() {
// 如果存在panic,则在这里进行恢复,并记录错误
if r := recover(); r != nil {
fmt.Printf("Worker %d panicked: %v\n", id, r)
}
}()
// 这里的代码可能会引起panic
fmt.Printf("Worker %d starting\n", id)
time.Sleep(sleepTime)
panic(fmt.Sprintf("Worker %d panicked", id))
}
func main() {
// 启动多个协程
for i := 1; i <= 3; i++ {
go worker(i, time.Duration(i)*time.Second)
}
// 让主goroutine暂停,以便允许其他goroutine运行
time.Sleep(3 * time.Second)
fmt.Println("Main function exiting")
}
这段代码定义了一个worker
函数,它使用defer/recover
模式来捕获并处理可能发生的panic。每个worker协程在defer
函数中进行了异常恢复的设置。如果worker函数中发生了panic,将会在recover
里被捕获,并打印出相关的错误信息。在main
函数中,我们启动了三个worker协程,每个协程的执行时间是其ID的倍数秒。通过time.Sleep
在主goroutine中等待一段时间以便让其他协程有机会运行,最后程序正常退出。
评论已关闭