GO 错误处理机制 | 学习笔记

简介: 快速学习 GO 错误处理机制

开发者学堂课程【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( ),两种写法是相同的。

相关文章
|
27天前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
23 2
|
3月前
|
Go
Go to Learn Go之错误处理
Go to Learn Go之错误处理
47 7
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
4月前
|
存储 编译器 Go
|
3月前
|
人工智能 算法 搜索推荐
Go学习笔记-代码调
近年来,人工智能技术飞速发展,Cody作为由Sourcegraph开发的一款AI驱动编码助手,应运而生。它不仅提供代码预测与补全,还能深度理解代码上下文,为开发者提供准确建议,提升编码效率和质量。Cody能识别潜在错误并提出修复建议,缩短调试时间,同时进行智能代码审查,帮助优化代码结构和风格。未来,随着AI技术进步,Cody将不断学习优化,成为开发者不可或缺的伙伴,推动编程领域的创新与发展。
33 0
|
4月前
|
Go 数据处理
|
4月前
|
Go 开发者
理解Go语言中的错误处理
【8月更文挑战第31天】
17 0
|
4月前
|
Java Go PHP
Go从入门到放弃之错误处理
Go从入门到放弃之错误处理
|
6月前
|
Go
go错误处理
go错误处理