Go 例程提供了強大的並發機制,可以並行執行獨立任務。然而,處理 Go 例程中的恐慌可能會帶來挑戰。
了解 Go 例程中的恢復
recover 函數允許從函數範圍內發生的恐慌中恢復。然而,它的有效性僅限於發生恐慌的同一個 goroutine。嘗試從其他 goroutine 中的恐慌中恢復將會失敗。
程式碼範例:失敗的恐慌恢復
下面的程式碼片段示範了從恐慌中恢復失敗的程式碼片段goroutine:
func main() { // Note: the following code will panic go handle(make(chan int64)) for {} } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
這段程式碼無法從handle goroutine中的panic中恢復,因為recover必須在引發panic的同一個goroutine中呼叫。
程式碼範例:成功的恐慌恢復
要成功從 goroutine 中的恐慌中恢復,必須在麻煩的 goroutine 中加入 defer receive 語句。以下是早期程式碼的修改版本,可以按預期工作:
func main() { done := make(chan int64) go func() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }() for {} }
在此範例中,延遲的恢復語句允許 goroutine 優雅地處理恐慌並記錄恢復訊息。
底層機制
根據 Go 文件,僅噹噹前 goroutine 中的所有延遲函數都已執行時才會發生緊急終止。因此,要從 Go 例程中的恐慌中恢復,必須在引發恐慌的同一個 Goroutine 中呼叫恢復,通常是透過延遲函數。
以上是如何從 Go 例程中的恐慌中恢復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!