目錄
- 一.利用defer+recover捕獲錯誤
- 二.基於errors.New自定義錯誤
- 三.panic自定義錯誤
一.利用defer+recover捕獲錯誤
package main
import "fmt"
func cal(a, b int) (res int) {
// 利用defer+recover來捕獲錯誤提高程式的健壯性,避免程式直接崩潰
//
// 溫馨提示:
// (1)recover()必須搭配defer使用;
// (2)defer一定要在可能引發panic的語句之前定義;
defer func() {
// 呼叫recover內建函式,可以捕獲錯誤
err := recover()
// 如果沒有捕獲錯誤,返回值為零值(nil)
if err != nil {
fmt.Printf("錯誤捕獲err: [%v]\n", err)
}
}()
// 注意,除數不能為0,否則會丟擲異常喲~
res = a / b
// 如果上一行程式碼執行出錯,就不會執行下面的一行程式碼啦~
fmt.Println("cal 函式執行結束")
return
}
func main() {
var (
x = 10
// y = 5
y = 0
)
result := cal(x, y)
fmt.Printf("%d ➗ %d = %d\n", x, y, result)
fmt.Println("main 函式執行結束")
}
二.基於errors.New自定義錯誤
package main
import (
"errors"
"fmt"
)
func cal(a, b int) (res int, err error) {
defer func() {
err := recover()
if err != nil {
fmt.Printf("錯誤捕獲err: [%v]\n", err)
}
}()
if b == 0 {
// 丟擲自定義錯誤,需要呼叫errors包下的New函式
return res, errors.New("除數不能為0喲~")
} else {
// 如果除數不為0,那麼就可以正常執行了
res = a / b
fmt.Println("cal 函式正常執行結束")
// 如果沒有錯誤,返回零值即可
return res, nil
}
}
func main() {
var (
x = 10
// y = 5
y = 0
)
result, err := cal(x, y)
if err != nil {
fmt.Printf("cal 函式異常執行結束,err ---> [%v]\n", err)
}
fmt.Printf("%d ➗ %d = %d\n", x, y, result)
fmt.Println("main 函式執行結束")
}
三.panic自定義錯誤
package main
import (
"errors"
"fmt"
)
func cal(a, b int) (res int, err error) {
defer func() {
err := recover()
if err != nil {
fmt.Printf("錯誤捕獲err: [%v]\n", err)
}
}()
if b == 0 {
return res, errors.New("除數不能為0喲~")
} else {
res = a / b
fmt.Println("cal 函式正常執行結束")
return res, nil
}
}
func main() {
var (
x = 10
// y = 5
y = 0
)
result, err := cal(x, y)
if err != nil {
// 如果程式出現錯誤以後,後續程式碼沒有必要執行,想要程式中斷退出程式,可以藉助內建函式(builtin)包下內建函式: "panic"。
panic(err)
}
fmt.Printf("%d ➗ %d = %d\n", x, y, result)
fmt.Println("main 函式執行結束")
}