golang - 异常处理

基本的异常处理

目前流行的语言错误处理都是通过 try catch finally 关键字或类关键字处理的

但是在 golang 中提供了一些全新模式, 不同于 try catch 语句, go语言通过函数返回错误来捕获, go内置了error接口, 只要实现Error() string方法, 通过判断 err 是否是 nil 来捕获异常.

func div(x float32, y float32) (result float32, err error) {}

golang 中提供了 defer 关键字, 这个语句会在执行完当前函数后执行, 类似 finally

func main() {
    // 相当于finally
    defer println("done!")
	println("hello, world")
}

举个具体的例子:

package main

import (
	"fmt"
	"math"
)

// 声明零除错误
type ZeroDivError struct {
	code    int
	message string
}

// 实现error接口
func (e ZeroDivError) Error() string {
	return fmt.Sprintf("%v: %v", e.code, e.message)
}

func div(x float32, y float32) (result float32, err error) {
	if y == 0 {
		return float32(math.Inf(1)), ZeroDivError{1, "零除问题"}
	}
	return x / y, err
}

func main() {
    // 相当于finally
    defer func() {
        println("done!")
    }

	// 这个相当于
	// try { r := div(1, 0) } catch e { println(r, e.Error() }
	r, e := div(1, 0)
	if e != nil {
		println(r, e.Error())
	}
}

panic 和 recover

golang 还提供了两个关键字 panicrecover, 按照上面的异常处理方式需要把错误一层一层的传递出去, 这两个关键字主要目的是用来做跨层级的异常捕获.

panic 用来立马中断当前程序返回异常, recover 用来捕获 panic 异常程序会继续执行

recover 只能在 defer 中才可以生效

panic 可以多次执行, 调用 recover 时会按顺序捕获错误

package main

import "fmt"

func a() {
	defer func() {
		e := recover()
		fmt.Printf("a e: %v\n", e)
		println("a done!")
	}()
	panic("a fatal!")
}

func b() {
	defer func() {
		e := recover()
		fmt.Printf("b e: %v\n", e)
		println("b done!")
	}()
	panic("b fatal!")
}

func main() {
	defer func() {
		e := recover()
		fmt.Printf("main e: %v\n", e)
		println("main done!")
	}()
	a()
	b()
	panic("main fatal!")
}

执行结果

a e: a fatal!
a done!
b e: b fatal!
b done!
main e: main fatal!
main done!

__EOF__

本文作者侯佳奇的博客
本文链接https://www.cnblogs.com/houjiaqi/p/18279430.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   侯佳奇  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示