golang 中的函數異常處理機制通過 panic() 拋出異常,recover() 在 defer 函數中捕獲未處理異常。當 panic() 被調用時,程序立即終止并查找最近的 defer 函數,按聲明順序執行,recover() 在第一個未被異常終止的 defer 函數中捕獲異常并繼續執行。通過該機制,可以優雅地處理錯誤情況,防止程序意外終止。
剖析 GoLang 函數異常處理機制
Golang 中的函數異常處理通過內置的 panic()
和 recover()
函數實現,提供了對程序正常執行流之外的錯誤情況的有效處理。
異常處理機制
引發異常: 通過使用 panic()
函數顯式引發異常。panic()
可以接受任意類型的參數,代表異常的詳細信息。
恢復異常: 使用 recover()
函數可以捕獲被引發但未處理的異常。recover()
僅在 defer
函數中有效。
流程:
-
當
panic()
被調用時,程序執行立即終止,并開始查找最近的 defer
函數。
defer
函數按其聲明順序從棧底開始執行。
當遇到第一個有 recover()
調用且沒有被異常終止的 defer
函數時,recover()
將捕獲異常并在其代碼塊中繼續執行。
之后,程序繼續執行 defer
函數序列中的余下部分,直到 defer
函數序列結束。
實戰案例
下面是一個使用函數異常處理機制處理除數為零錯誤的示例代碼:
package main import "fmt" func divide(x, y float64) float64 { defer func() { if err := recover(); err != nil { fmt.Println("除數為零,無法執行除法。", err) } }() return x / y } func main() { num1 := 100 num2 := 0 result, err := divide(num1, num2) if err != nil { fmt.Println("處理除以零錯誤:", err) } else { fmt.Println("結果:", result) } }
登錄后復制
在上述示例中:
divide()
函數通過 defer
函數中的 recover()
捕獲除數為零的異常。
main()
函數處理捕獲到的異常并向用戶輸出錯誤消息。
如果除數不為零,則返回正常的計算結果。
因此,通過使用函數異常處理機制,可以優雅地處理錯誤情況,防止程序意外終止。