在 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中文網其他相關文章!