go 語言通過內建的錯誤介面提供了非常簡單的錯誤處理機制。
error型別是乙個介面型別,這是它的定義:
type error inte***ce
我們可以在編碼中通過實現 error 介面型別來生成錯誤資訊。
函式通常在最後的返回值中返回錯誤資訊。
使用errors.new 可返回乙個錯誤資訊:
func sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.new("math: square root of negative number")
// 實現
在下面的例子中,我們在呼叫sqrt的時候傳遞的乙個負數,然後就得到了non-nil的error物件,將此物件與nil比較,結果為true,所以fmt.println(fmt包在處理error時會呼叫error方法)被呼叫,以輸出錯誤,請看下面呼叫的示例**:
result, err:= sqrt(-1)
if err != nil {
fmt.println(err)
例項:
執行以上程式,輸出結果為:
panic 與 recover 是 go 的兩個內建函式,這兩個內建函式用於處理 go 執行時的錯誤。
panic 用於主動丟擲錯誤,recover 用來捕獲 panic 丟擲的錯誤。
(1)、引發panic有兩種情況,一是程式主動呼叫,二是程式產生執行時錯誤,由執行時檢測並退出。
(2)、發生panic後,程式會從呼叫panic的函式位置或發生panic的地方立即返回,逐層向上執行函式的defer語句,然後逐層列印函式呼叫堆疊,直到被recover捕獲或執行到最外層函式。
(3)、panic不但可以在函式正常流程中丟擲,在defer邏輯裡也可以再次呼叫panic或丟擲panic。defer裡面的panic能夠被後續執行的defer捕獲。
(4)、recover用來捕獲panic,阻止panic繼續向上傳遞。recover()和defer一起使用,但是defer只有在後面的函式體內直接被掉用才能捕獲panic來終止異常,否則返回nil,異常繼續向外傳遞。
例項:
1)、panic 在沒有用 recover 前以及在 recover 捕獲那一級函式棧,panic 之後的**均不會執行;一旦被 recover 捕獲後,外層的函式棧**恢復正常,所有**均會得到執行;
2)、panic 後,不再執行後面的**,立即按照逆序執行 defer,並逐級往外層函式棧擴散;defer 就類似 finally;
3)、利用 recover 捕獲 panic 時,defer 需要再 panic 之前宣告,否則由於 panic 之後的**得不到執行,因此也無法 recover;
討論 日誌出錯了,應不應該丟擲錯誤
最近一直在想,業務日誌出錯了,應不應該丟擲錯誤?例如以下 12 3shop.addproduct 4log.writelog 新增了一件新商品,物品名為xx,xx 5 public class log 如果log.writelog出現了錯誤,應該丟擲錯誤嗎?若丟擲錯誤,便可以及時發現錯誤,並處理.但...
討論 日誌出錯了,應不應該丟擲錯誤
最近一直在想,業務日誌出錯了,應不應該丟擲錯誤?例如以下 12 3shop.addproduct 4log.writelog 新增了一件新商品,物品名為xx,xx 5 public class log 如果log.writelog出現了錯誤,應該丟擲錯誤嗎?若丟擲錯誤,便可以及時發現錯誤,並處理.但...
go語言錯誤型別
1.考慮的error的使用原因 error型別本身就是乙個預定義好的介面,裡面定義了乙個method type error inte ce 2如何完成error的第乙個簡單的呼叫,輸出的格式err fmt.errorf s error this is error func main fmt.prin...