丟擲錯誤 GO語言入門 21 錯誤處理

2021-10-14 18:46:04 字數 1746 閱讀 6129

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...