一、错误处理基本概念与优点
1、基本概念
在默认情况下,当程序运行的时候发生错误(panic)时,程序就会退出,那么如果我们希望发生错误时,可以捕获错误并进行处理,保证程序可以继续执行,这就需要错误处理机制(类似Java中的异常处理机制)。
2、优势
进行错误处理后,程序不会轻易挂掉退出,如果再加入预警代码的话,还可以让程序更加健壮。
二、GO中的错误处理方式
GO追求简洁优雅,所以GO不支持传统的try…catch…finally这种处理方式。
GO引用的处理方式为:defer,panic,recover
处理的过程为:GO中抛出一个panic异常,然后在defer中通过recover来捕获这个异常,然后正常处理。
下面是一个使用案例。
import(
"fmt"
)
func test() {
defer func() {
err := recover()
if err != nil {
fmt.Println("err=", err)
}
}()
num1 := 88
num2 := 0
fmt.Println(num1 / num2)
}
func main(){
test()
}
执行后发现,代码可以正常结束,并且会输出如下结果
其中,recover()是GO的内置函数,可以用于捕获异常,然后将结果返回给为error类的err,随后在后面的if条件中进行处理。利用defer声明的匿名函数,在整个函数执行的最后执行上述操作,来捕获执行过程中出现的异常,并进行处理。
三、自定义错误
同样的,GO中也支持自定义错误,使用的是errors.New和panic内置函数。
errors.New("错误说明"),会返回一个error类型的值,表示一个错误,而panic内置函数可以接收interface{}类型的值作为参数,所以可接受error类型的变量,输出错误信息,并退出程序。
以下为一个示例代码:
import(
"fmt"
)
func getAge(age int) error {
if age < 0 {
return errors.New("年龄不能为负数")
} else {
return nil
}
}
func test2() {
err := getAge(-1)
if err != nil {
panic(err)
}
fmt.Println("test2() continue")
}
func main(){
test2()
}
代码的执行结果为:
并且会有报错信息:
以上为自定义错误的相关说明。