GoLang學習十七 錯誤處理

2021-10-08 13:23:13 字數 4430 閱讀 6212

錯誤是什麼?

錯誤指的是可能出現問題的地方出現了問題。比如開啟乙個檔案時失敗,這種情況在人們的意料之中。

而異常指的是不應該出現問題的地方出現了問題。比如引用了空指標,這種情況在人們的意料之外。可見,錯誤是業務過程的一部分,而異常不是。

go中的錯誤也是一種型別。錯誤用內建的error型別表示。就像其他型別的,如int, float64, 。錯誤值可以儲存在變數中,從函式中返回,等等。

讓我們從乙個示例程式開始,這個程式嘗試開啟乙個不存在的檔案。

在os包中有開啟檔案的功能函式:

func open(name string) (file *file, err error)

如果檔案已經成功開啟,那麼open函式將返回檔案處理。如果在開啟檔案時出現錯誤,將返回乙個非nil錯誤。

func

main()

fmt.

println

(f.name()

,"opened success"

)}

如果乙個函式或方法返回乙個錯誤,那麼按照慣例,它必須是函式返回的最後乙個值。因此,open 函式返回的值是最後乙個值。

處理錯誤的慣用方法是將返回的錯誤與nil進行此較。nil值表示沒有發生錯誤,而非nil值表示出現錯誤。在我們的例子中,我們檢查錯誤是否為nil。如果它不是nil,我們只需列印錯誤並從主函式返回。

go語言通過內建的錯誤介面提供了非常簡單的錯誤處理機制。

讓我們再深入一點,看看如何定義錯誤型別的構建。錯誤是乙個帶有以下定義的介面型別,

type

error

inte***ce

它包含乙個帶有error ()字串的方法。任何實現這個介面的型別都可以作為乙個錯誤使用。這個方法提供了對錯誤的描述。

當列印錯誤時,fmt.printin函式在內部呼叫error() 方法來獲取錯誤的描述。這就是錯誤描述是如何在一行中列印出來的。

從錯誤中提取更多資訊的不同方法

既然我們知道錯誤是一種介面型別,那麼讓我們看看如何提取更多關於錯誤的資訊。

在上面的例子中,我們僅僅是列印了錯誤的描述。如果我們想要的是導致錯誤的檔案的實際路徑。一種可能的方法是解析錯誤字串。

// errors 建立error物件

err = errors.

new(

"錯誤資訊!!!!"

) fmt.

println

(err)

// 錯誤資訊!!!!

fmt.

printf

("%t\n"

, err)

// *errors.errorstring

// fmt 建立error物件

err2 := fmt.

errorf

("錯誤資訊: %d"

,100

) fmt.

println

(err2)

// 錯誤資訊: 100

fmt.

printf

("%t\n"

, err2)

// *errors.errorstring

func

checkage

(age int

)error

return

nil}

package main

import

("fmt"

)/**

* @author: zsy

* @date: 2020/7/26 21:21

* @desc:

*/// 定義乙個結構體,表示錯誤的型別

type areaerror struct

// 實現error介面,就是實現error()方法

func

(e *areaerror)

error()

string

func

(e *areaerror)

lengthnegative()

bool

func

(e *areaerror)

widthnegative()

bool

func

rectarea

(length, width float64)(

float64

,error

)if width <

0else

}if msg !=""}

return length * width,

nil}

func

main()

if err.

widthnegative()

fmt.

println

(err.length)

// -4

fmt.

println

(err.width)

// -3

fmt.

println

(err.msg)

// 長度小於0,寬度小於0

}return

} fmt.

println

("面積:"

, area)

}

defer 相當於把當前行放到乙個棧裡面,最後執行,每個方法屬於乙個區域

函式a()

函式b()12

3456

789defer 函式b()2。。。

defer 函式b()1。。。。

main…over…

defer main 4。。。。

defer main 3。。。。

func

myprint

(s string

)func

funa()

func

funb()

defer

myprint

("defer 函式b()2。。。")}

func

main()

panic 其後的所有都不能執行了中斷了,只有已經被執行defer的函式執行完後,這個恐慌(panic)才會傳到函式呼叫處

函式a()

函式b()12

345defer 函式b()1。。。。

defer main 3。。。。

panic: 函式b() panic

goroutine 1 [running]:

main.funb()

d:/go/goworks/src/basic/panicdemo.go:24 +0x1f2

main.main()

d:/go/goworks/src/basic/panicdemo.go:33 +0xda

package main

import

"fmt"

/** * @author: zsy

* @date: 2020/7/26 21:39

* @desc:

*/func

myprint

(s string

)func

funa()

func

funb()

}defer

myprint

("defer 函式b()2。。。")}

func

main()

可以捕獲panic,還可以獲取panic中的資訊

panic — try

recover – catch

函式a()

函式b()12

345defer 函式b()1。。。。

函式b() panic 程式恢復

main…over…

defer main 4。。。。

defer main 3。。。。

package main

import

"fmt"

/** * @author: zsy

* @date: 2020/7/26 21:39

* @desc:

*/func

myprint

(s string

)func

funa()

func

funb()

}() fmt.

println

("函式b()"

)defer

myprint

("defer 函式b()1。。。。"

)for i :=

1; i <

10; i++

}defer

myprint

("defer 函式b()2。。。")}

func

main()

golang 錯誤處理

go 程式使用 error 值來表示錯誤狀態。與 fmt.stringer 類似,error 型別是乙個內建介面 type error inte ce 與 fmt.stringer 類似,fmt 包在列印值時也會滿足 error。通常函式會返回乙個 error 值,呼叫的它的 應當判斷這個錯誤是否等...

golang 錯誤處理

一 defer package main import fmt os bufio func trydefer func writefile filename string else return defer file.close 無論return panic最後都會被執行 writer bufio....

Golang的錯誤處理

1 當錯誤 panic 發生後,程式就會退出 崩潰 2 希望發生錯誤後,能夠捕獲到錯誤,並對其進行處理,保證後續程式能夠繼續執行 go中引入的處理方式是 defer panic recover。其中go中可以丟擲乙個panic異常,然後在defer中通過recover捕獲這個異常,然後正常處理。1 ...