1.在默认情况下,当发生错误后(panic),程序就会出现退出(崩溃);
2.如果我们希望,当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行,还可以在捕获到错误后,给管理员一个提示(邮件,短信...);
Go语言追求简洁优雅,所以,Go语言不支持传统的try...catch...finally 这种处理;
Go中引入的处理方式为:defer, panic, recover;
这几个异常的使用场景可以这么简单描述,Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
错误处理的好处:
进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加健壮;
示例:
// 错误处理机制
func errTest() {
// 加defer 来处理错误 + 匿名函数
defer func () {
err := recover() // 用来捕获错误
if err != nil { // 有错误处理
fmt.Println("err===", err) // err=== runtime error: integer divide by zero
// 可以加上错误报警机制
fmt.Println("错误捕获到了发邮件给admin.@kuais.com")
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res==",res)
}
自定义错误:
Go程序中,也支持自定义错误,使用errors.New 和 panic 内置函数;
1.erros.New("错误说明") 会返回一个error类型的值,表示一个错误
2.panic内置函数,接受一个interface{}类型的值(也就是任何值了)作为参数,可以接受error类型的变量,输出错误信息,并退出程序;
示例:
// 自定义错误测试
// 一个读取文件名的函数
func readConf(filename string) (err error){
if filename == "config.ini"{
return nil
}else{ // 返回一个自定义错误
return errors.New("读取文件名错误...")
}
}
// 测试自定义错误函数
func selfErrortest(name string){
err := readConf(name)
if err != nil { // 如果 读取文件发生错误,就会输出这个错误,并终止程序
panic(err)
}
fmt.Println("selfErrortest()继续执行...")
}