error handling
一个异常实例
package main
import "fmt"
func main() {
test(2,1)
fmt.Println("上面的方法执行成功")
fmt.Println("正常执行下面的逻辑")
}
func test(num1,num2 int) {
fmt.Println(num1/num2)
}
执行上面的代码:
我们把num2换成0再试试:
可以看到程序出现错误/panic以后,程序被中断,无法继续执行。
下面这2行代码并没有输出
fmt.Println("上面的方法执行成功")
fmt.Println("正常执行下面的逻辑")
golang错误处理机制
golang追求代码的整洁优雅,并没有采用java的try catch finally
捕获异常的机制
引入机制:defer + recovery
在buildin中有个内置函数recover()
直白一点的理解就是:recover()能够接收和管理程序中的异常,使error不被抛出,但必须与defer一起才好用;如果接收值为nil就表示程序无异常,反之异常
package main
import "fmt"
func main() {
test(2,0)
fmt.Println("上面的方法执行成功")
fmt.Println("正常执行下面的逻辑")
}
func test(num1,num2 int) {
//利用defer+recover来捕获错误
//为什么要加defer:因为我们要写很多代码 不知道会在哪一行抛出错误
defer func() {
err:= recover()
//如果没有捕获到错误则返回零值nil
if err!=nil{
fmt.Printf("捕获到异常%v\n",err)
}
}()
fmt.Println(num1/num2)
}
执行代码:
自定义error
可以看到,上面的异常信息对我们程序员不是很友好,runtime error: integer divide by zero
是golang自己定义的
那么能不能让我们自定义异常呢?答案是肯定的
errors
包下的New方法会翻译一个error
还是用上面的例子:
package main
import (
"errors"
"fmt"
)
func main() {
err:=test(2,0)
if err!=nil{
fmt.Println(err)
return
}
fmt.Println("上面的方法执行成功")
fmt.Println("正常执行下面的逻辑")
}
func test(num1,num2 int) error{
if num2==0 {
//抛出自定义错误
return errors.New("除数不能为0额~~~")
}else {
fmt.Println(num1 / num2)
//如果没有错误 返回零值
return nil
}
}
执行代码:
还有种情况:程序出现错误之后,后续的代码就没必要去执行了,想让程序中断,退出程序;借助buildin包下的内置函数:panic
package main
import (
"errors"
"fmt"
)
func main() {
err:=test(2,0)
if err!=nil{
panic(err)
}
fmt.Println("上面的方法执行成功")
fmt.Println("正常执行下面的逻辑")
}
func test(num1,num2 int) error{
if num2==0 {
//抛出自定义错误
return errors.New("除数不能为0额~~~")
}else {
fmt.Println(num1 / num2)
//如果没有错误 返回零值
return nil
}
}