Go错误处理
error接口
? ? ? ? ? Go語言引入了一個關于錯誤處理的標準模式,即error接口,該接口的定義如下:
? ? ? ? ? ?
? ? ? ? ? ? 對于大多數函數,如果要返回錯誤,大致上都可以定義為如下模式, 將error作為多種返回值中的最后一個,但這并非是強制要求:
? ? ? ? ? ?
? ? ? ? ? ?調用時的代碼建議按如下方式處理錯誤情況:
? ?
示例如下:
? ? ? ? ? ??
? ? ?
? 實現Error()方法:? ? ? ? ? ?
之后就可以直接返回PathError變量了,如下:
如果在處理錯誤時獲取詳細信息,而不僅僅滿足與打印一句錯誤信息,那就需要用到類型轉換知識了:
defer
? ? ? ? Go語言使用defer關鍵字能簡單地解決資源釋放問題。如下
? ? ? ? ? 即使其中的Copy函數拋出異常,Go仍然會保證dstFile和srcFile會被正常關閉。
? ? ? ? ? 如果覺得一句話干不完清理的工作,也可以使用在defer后加一個匿名函數的做法:
? ? ? ? ? ?
? ? ? ? ? ?另外,一個函數中可以存在多個defer語句,因此需要注意的是,defer語句的調用是遵照先進后出的原則,即最后一個defer語句將最先被執行。只不過,當需要為defer語句到底哪個先執行這種細節而煩惱的時候,說明代碼架構可能需要調整一下了。
panic()和recover()
? ? ? ? ?Go語言引入了兩個內置函數panic()和recover()以報告和處理運行時錯誤和程序中的錯誤場景:
?? ? ? ? ? ? ?當在一個函數執行過程中調用panic()函數時,正常的函數執行流程將立即終止,但函數中之前使用defer關鍵字延遲執行的語句將正常展開執行,之后該函數將返回到調用函數,并導致逐層向上執行panic流程,直至所屬的goroutine中所有正在執行的函數被終止。錯誤信息將被報告,包括在調用panic()函數時傳入的參數,這個過程被稱為錯誤處理流程。
? ? ? ? ? 從panic()的參數類型interface{}得知,該函數接收任意類型的數據,比如整型、字符串、對象等。調用方法很簡單:
? ? ? ? ? ? recover()函數用于終止錯誤處理流程。一般情況下,recover()應該在一個使用defer關鍵字的函數中執行以有效截取錯誤處理流程。如果沒有在發生異常的goroutine中明確調用恢復過程(使用recover關鍵字),會導致該goroutine所屬的進程打印異常信息后直接退出。
? ? ? ? ? 無論foo()中是否觸發了錯誤處理流程,該匿名defer函數都將在函數退出時得到執行。假如foo()中觸發了錯誤處理流程,recover()函數執行將使得該錯誤處理過程終止。如果錯誤流程被觸發時,程序傳給panic函數的參數不為nil,則該函數還會打印詳細的錯誤信息。
?
本文參考:
https://www.yuque.com/docs/share/00267fe4-9bcc-4bf6-b019-84beb79f7eac
總結
- 上一篇: iOS 越狱手机 ikeymonitor
- 下一篇: W3School 离线手册最新版下载