例外處理
panic 例外處理
? 如果出現了panic例外,那么會停止當前函式的運行,然后會找recover()方法,如果沒有的話,就會報錯退出程式,如果有就會執行recover的方法體中的方法
? 我們可以使用defer延遲處理函式來捕獲panic例外,用recover()來從錯誤場景中恢復,必須的在defer修飾的方法中使用,不然不生效,panic拋出例外,defer具備延遲處理功能,所以最后這種兜底的活只能defer來做
// 定義一個帶有panic例外的方法
func Test01(tmp int) string {
fmt.Println("This is a test!")
// 如果傳入的引數是負數,那么就會拋出panic例外
if tmp <= 0 {
panic("不能傳遞非正數")
}
return "這是一個正數"
}
func main() {
// 使用defer + recover來兜底
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
}()
fmt.Println(Test01(-1))
// 由于panic例外會停止當前函式運行,所以下面的輸出不會被執行
fmt.Println("例外處理之后")
}
errors 例外處理
? Go語言有一個預先定義的 error 介面型別,同時也提供了一個包 errors,包中有一個 errorString 結構體實作了 error 介面 ,任何時候當你需要一個新的錯誤型別,都可以用 errors 包的errors.New函式接收合適的錯誤資訊來創建
? error例外不會中斷程式運行,所以不需要defer 和 recover 兜底
// 回傳值要宣告error型別
func Test02(tmp int) (res string, err error) {
if tmp > 0 {
// 如果正常輸出,也需要回傳nil
return "這是正數", nil
} else {
// 使用函式創建error例外
err := errors.New("不能傳遞非正數!")
return "", err
}
}
func main() {
res, err := Test02(34)
if err != nil {
fmt.Println("出現錯誤:", err)
} else {
fmt.Println("傳參正確:", res)
}
// error例外不會中斷運行,下面的輸出會被執行
fmt.Println("例外處理之后")
}
自定義例外
// 新建一個例外結構體,用來存盤引數
type customException struct {
contain string
}
// 實作Error介面
func (tmp *customException) Error() string {
err := fmt.Sprintf("這是一個自定義錯誤: %s", tmp.contain)
return err
}
func Test03(tmp int) (res string, err error) {
if tmp < 0 {
panic(&customException{"不能傳入負數"})
} else if tmp == 0 {
err = &customException{"不能傳入0"}
return
} else {
return "這是一個正數", nil
}
}
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
}()
res, err := Test03(-1)
if err != nil {
fmt.Println("出現錯誤:", err)
} else {
fmt.Println("傳參正確:", res)
}
fmt.Println("例外處理之后")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550913.html
標籤:其他
下一篇:返回列表
