Golang语言错误处理机制
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.利用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 函数运行结束")
}
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/18314033