作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。
源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign)、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列
基础系列专栏:30天熟悉GO语言(建设中)
码文不易,如果感觉博主的文章还不错,请点赞👍、收藏 ⭐️支持一下博主哇 🙏
联系方式:Saint9768,加我进技术交流群,一起学习进步📚、freedom✈️🌊
文章目录
- 一、前言
- 二、异常处理
- 1)Go的异常处理机制
- 1、defer关键字
- 2、recover函数
- 3、defer + recover 捕获异常示例
- 2)自定义异常
- 示例
- 3)错误中断程序执行
- 三、总结
一、前言
Go系列文章:
- GO开篇:手握Java走进Golang的世界
- 2 Go开发环境搭建、Hello World程序运行
- 3 Go编程规约和API包
- 4 Go的变量、常量、运算符
- 5 Go 基本数据类型
- 6 Go 复杂数据类型之指针
- 7 Go流程控制之分支结构if、switch
- 8 Go流程控制之循环结构for range、goto、break、continue
- Go函数全方位解析
Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html
二、异常处理
程序出现错误后,会被中断,无法继续执行。
package main
import "fmt"
func main() {
testErrorHandle()
fmt.Println("test函数执行成功")
}
func testErrorHandle() {
num1 := 10
num2 := 0
result := num1 / num2
fmt.Println(result)
}
异常输出如下:
我们需要通过错误处理/异常捕获,使程序可以继续执行。
1)Go的异常处理机制
go追求代码优雅,通过defer + recover的方式实现异常处理机制,进而提高程序健壮性。
1、defer关键字
在golang中,程序遇到defer关键字,不会立即执行defer后的语句,而是将defer后的语句压入一个栈中,然后继续执行函数后面的逻辑。在函数执行完毕后,从栈中依次取出defer语句执行。
此外,defer关键字遵守FILO的特性,若多个defer函数在同一函数内,执行顺序遵循先进后出原理。即第一个defer函数最后一个被执行。
2、recover函数
recover是Go语言的内置函数,用于在发生 panic 后进行恢复,当 panic 发生时,程序会立即终止并开始执行对应的 recover 代码块。即:用于捕获函数错误。
3、defer + recover 捕获异常示例
通过recover()函数捕获到了异常,然后defer关键字将异常压入一个栈中,接着继续执行main()函数后面的逻辑,最后执行异常打印出来。
package main
import "fmt"
func main() {
testErrorHandle()
fmt.Println("test函数执行成功")
}
func testErrorHandle() {
// 使用defer + recover捕获异常;并直接调用匿名函数
defer func() {
// 调用recover内置函数捕获错误,如果没有可捕获的错误,recover()函数返回零值:nil
err := recover()
if err != nil {
fmt.Println("错误被捕获,error is ", err)
}
}()
num1 := 10
num2 := 0
result := num1 / num2
fmt.Println(result)
}
异常捕获:
2)自定义异常
使用需要调用errors包下的New()函数进行自定义异常,但是New()函数仅支持自定义一个字符串。
示例
package main
import (
"errors"
"fmt"
)
func main() {
err := customException()
if err != nil {
fmt.Println("自定义错误为:", err)
}
fmt.Println("test函数执行成功")
}
// 函数的返回类型为error
func customException()(err error) {
num1 := 10
num2 := 0
if num2 == 0 {
// 抛出自定义异常
return errors.New("除数不能为0")
} else {
// 正常执行
result := num1 / num2
fmt.Println(result)
return nil
}
}
控制台输出:
3)错误中断程序执行
一些场景,我们希望程序出现错误之后,后续代码不再执行,程序中断并退出。
我们可以使用builtin包下的panic()内置函数,中断程序的执行。
示例:
- 当customException()函数返回异常信息之后,panic()函数将中断main()函数的执行。
package main
import (
"errors"
"fmt"
)
func main() {
err := customException()
if err != nil {
fmt.Println("自定义错误为:", err)
// 中断程序的执行
panic(err)
}
fmt.Println("test函数执行成功")
}
// 函数的返回类型为error
func customException()(err error) {
num1 := 10
num2 := 0
if num2 == 0 {
// 抛出自定义异常
return errors.New("除数不能为0")
} else {
// 正常执行
result := num1 / num2
fmt.Println(result)
return nil
}
}
控制台输出:
三、总结
Go的异常处理分三块:通过defer关键字 + recover()函数捕获异常、通过errors包下的New()函数自定义异常、通过panic()函数中断程序执行。