开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: GO 错误处理机制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9621
GO 错误处理机制
基本内容
一、 前景引入
二、 基本说明
三、 使用 defer+recover 来处理错误
四、 错误处理的好处
一、前景引入
1、先看一段代码,看看输出什么?代码如下:(错误处理)
package main
import (
"fmt"
)
func test() {
num1 := 10
num2 :=0
res := num1 / num2
fmt.Println( "res=", res)
}
func main() {
//测试 test()
fmt.Println( "main()下面的代码和逻辑")
}
引出 golang 的错误处理机制
2、主函数“func main() {”
里面调用了 test。test 中有 num1,num2。用 num1 除以 num2,但是 num2 是 0,但是在除法中分母不能为 0,所以会报错。
问:在 golang 中出现了错误会怎么处理?
答:新建一个文件夹“error”,创建一个新的文件“main.go”。如果调用 test(),再输出 fmt.Println( "main() 下面的代码和逻辑")
,看在 go 中出现错误是否能执行到这段代码,运行后发现不能执行到这段代码。从进入到 test 中后,在 res := num1 / num2 报错了,错误的原因是除以 0。现在希望即使代码出错了,仍能将代码继续往下执行,第二即使出错了,给一个预警的机制,在 golang 中也有错误处理机制,它的错误处理机制应用起来能够让代码效率更高。上面程序报错了,下面的代码仍能继续执行。第二检测到了错误,能发一个邮件给管理员告知服务器有代码错误。所以通过这个案例引出了错误管理机制。
3、对上面代码的总结
(1) 在默认情况下,当发生错误后 (panic) ,程序就会退出(崩溃.)
(2) 当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(邮件、短信等等)
(3) 这里引出错误处理机制。
二、基本说明
1、 Go 语言追求简洁优雅。所以Go语言不支持传统的 try… catch…finally 这种处理。
JAVA 的错误处理是 try…catch…finally 这种处理,但在 Go 语言中并不用这种,很容易造成程序的混乱。
2、 Go 中引入的处理方式为: defer,panic, recover
3、 这几个异常的使用场景可以这么简单描述:当发生错误的时候 Go 中可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理。往往这三种是结合使用。
三、 使用 defer+recover 来处理错误
1、准确的说异常会在 test 中发生,使用 defer + recover 来捕获和处理异常, defer 后面调用一个匿名函数,函数中 recover() 内置函数,可以捕获到异常,判断有没有错误 if err != nil,如果不等于 nil 说明有错误,说明捕获到错误。再把错误异常进行打印,匿名函数的调用括起来就可以,处理完后下面的代码可以继续执行。如果是一个循环,它会不停的执行,可以对代码进行休眠 time.Sleep(time.Second)
,需要引入 time 包,代码每隔两秒也在执行,这相当于对异常和错误进行捕获。
2、代码如下:
package main
import(
"fmt"
"time"
)
func test( ) {
//使用 defer + recover 来捕获和处理异常
defer func( ) {
err := recover ( )
// recover( ) 内置函数,可以捕获到异常
if err != nil {
//说明捕获到错误
fmt.Println( "err=", err)
}
}
num1 := 10
num2 := 0
res ;= num1 / num2
fmt.Println( "res=", res)
}
func main() {
//测试
test()
fmt.Println( "main()下面的代码...")
time.Sleep(time.Second)
//休眠
}
3、 运行结果为:main< >
下面的代码。
四、 错误处理的好处
1、进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。
2、案例演示:
func test() {
//使用 defer + recover 来捕获和处理异常
defer func( {
err := recover()
// recover() 内置函数,可以捕获到异常
if err != nil {
//说明捕获到错误
fmt.Println( "err=", err)
//这里就可以将错误信息发送给管理员....
fmt.Println("发送邮件给admin@sohu. com~")
}
}
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println( "res=", res)
}
3、代码分析:
fmt.Println( "err=", err)
这里就可以将错误信息发送给管理员....,GO 语言也有支持发送信息的机制,fmt.Println ("发送邮件给admin@sohu. com~") 。代码运行后,发送邮件给了管理员,代码还在继续执行。所以说,代码可以加入预警机制和相应的提示信息给管理员。
可以保证程序不崩溃,继续执行
捕获的 err 的时候,可以将信息发送给管理员
err := recover( )
等价于 err:=recover( )
,两种写法是相同的。