不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

    • 01.函数
    • 02.defer延时调用
    • 03.异常处理
      • 01.异常处理介绍
        • 1.1 go中异常处理介绍
        • 1.2 panic
        • 1.3 recover
        • 1.4 注意
      • 02.panic/recover异常处理
        • 2.1 panic触发程序奔溃
        • 2.2 defer 、recover 实现异常处理
        • 2.3 defer 、panic、recover 抛出异常
    • 04.interface面向对象
    • 05.装饰器
  • 并发编程

  • 常用库

  • 数据库操作

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • 面向对象
xiaonaiqiang
2021-06-11
目录

03.异常处理

# 01.异常处理介绍

# 1.1 go中异常处理介绍

  • Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。

  • Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

  • panic可以在任何地方引发,但 recover 只有在 defer 调用的函数中有效。

# 1.2 panic

  • 1、内置函数
  • 2、假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行
  • 3、返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行
  • 4、直到goroutine整个退出,并报告错误

# 1.3 recover

  • 1、内置函数
  • 2、用来控制一个goroutine的panicking行为,捕获panic,从而影响应用的行为
  • 3、一般的调用建议
    • a). 在defer函数中,通过recever来终止一个goroutine的panicking过程,从而恢复正常代码的执行

    • b). 可以获取通过panic传递的error

# 1.4 注意

  • 利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。
  • 否则当panic时,recover无法捕获到panic,无法防止panic扩散。
  • recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。
  • 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用。

# 02.panic/recover异常处理

# 2.1 panic触发程序奔溃

  • 程序运行期间 funcB 中引发了 panic 导致程序崩溃,异常退出了。
  • 这个时候我们就可以通过recover 将程序恢复回来,继续往后执行。
package main
func funcB() {
	panic("panic in B")
}
func main() {
	funcB()
}
/*
goroutine 1 [running]:
main.funcB(...)
	E:/_000/Go/Code/demo1.go:3
main.main()
	E:/_000/Go/Code/demo1.go:6 +0x45
 */
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2.2 defer 、recover 实现异常处理

  • recover()必须搭配 defer 使用

  • defer 一定要在可能引发 panic 的语句之前定义

package main
import "fmt"

func funcB() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err) // runtime error: integer divide by zero
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res=", res)
}
func main() {
	funcB()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2.3 defer 、panic、recover 抛出异常

package main

import (
	"errors"
	"fmt"
)

func readFile(fileName string) error {
	if fileName == "main.go" {
		return nil
	}
	return errors.New("读取文件错误")
}
func fn3() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err) // 读取文件错误
		}
	}()
	var err = readFile("xxx.go")
	if err != nil {
		panic(err)
	}
	fmt.Println("继续执行")
}

func main() {
	fn3()
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
上次更新: 2024/3/13 15:35:10
02.defer延时调用
04.interface面向对象

← 02.defer延时调用 04.interface面向对象→

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式