在 Goroutine 中处理异常:使用 recover 从恢复点获取异常。在 defer 语句内处理异常,例如打印友好的 errorMessage。实战案例:异步检查用户访问权限并捕获权限不足的异常,向用户显示友好消息。
如何在 Goroutine 中处理异常?
在并发编程中,协程或 Goroutine 是独立执行的轻量级线程。然而,在 Goroutine 中处理异常与传统线程不太相同。
处理 Goroutine 中的异常
首先,让我们创建一个 Goroutine:
func main() { go func() { // 可能会抛出异常的代码 }() }
Go 默认不会捕获 Goroutine 中的异常。如果 Goroutine 抛出异常,程序将崩溃。为了处理异常,我们需要使用 recover
函数:
func main() { go func() { defer func() { if r := recover(); r != nil { // 处理异常 fmt.Println("捕获到异常:", r) } }() }() }
在 defer
语句的内部,我们使用 recover
从恢复点获取异常并根据需要处理它。
实战案例:访问受保护资源
假设我们有一个受保护的资源,只有具有特定访问权限的用户才能访问它。我们可以使用 Goroutine 来异步检查用户的权限:
func checkAccess(userId int) error { user, err := getUserByID(userId) if err != nil { return err } if user.accessLevel != ADMIN { return errors.New("没有访问权限") } return nil } func main() { userIDs := []int{1, 2, 3} for _, id := range userIDs { go func(userId int) { if err := checkAccess(userId); err != nil { defer func() { if r := recover(); r != nil { // 处理异常:权限不足 fmt.Println("用户", userId, ": 权限不足") } }() panic(err) } fmt.Println("用户", userId, ": 有访问权限") }(id) } }
在这个示例中,Goroutine 可能会抛出 errors.New("没有访问权限")
异常,这将导致程序崩溃。通过使用 defer
语句和 recover
函数,我们能够捕获异常并向用户显示友好的 errorMessage。
以上是如何在 Goroutine 中处理异常?的详细内容。更多信息请关注PHP中文网其他相关文章!