0
点赞
收藏
分享

微信扫一扫

golang 入门(十) 异常处理

1、recovery捕获异常

代码在运行的时候,总会遇到错误。有的时候我们会希望程序遇到错误以后继续运行后面的流程,而不是直接异常退出。在Python中,使用try except组合实现这种需求,代码如下”

s = 0
try:
# 用5除以0,会造成计算结果异常
ret = 5/s
print("运行结果是 {}".format(ret))

except Exception as e:
print("我发现了异常 {}".format(e))

print("我还能继续运行到程序结束")

运行结果

% python main.py 
我发现了异常 division by zero
我还能继续运行到程序结束

Go中没有类似try except这种语法,我们使用内置函数recovery()来替代except捕获异常,要注意recovery()必须与延迟执行函数defer()一起使用。代码如下:

package main

import "fmt"

func calc(s int) {
// 定义一个延迟的匿名函数并运行
defer func() {
// 捕获异常,并赋值给变量。相当于python中except部分的功能
err := recover()
if err != nil {
fmt.Println("我发现了异常: ", err)
}
}()

ret := 5 / s
fmt.Println("运行结果是: ", ret)
}

func main() {

calc(0)

fmt.Println("我还能继续运行到程序结束")
}

运行结果

% go run main.go
我发现了异常: runtime error: integer divide by zero
我还能继续运行到程序结束


2、panic触发异常

除了系统判断出来的程序异常外,我们也会有需求可以自己主动抛出异常来终止程序或进行错误预警。在python中,我们通过raise关键字来实现这个需求,代码如下:

s = 5
try:
ret = int(5/s)
# 程序没错,我也可以自己触发异常
raise Exception("运行结果< {} >是正确的,但我就想抛个异常出来".format(ret))

except Exception as e:
print("我发现了异常: {}".format(e))

print("我还能继续运行到程序结束")

运行结果

% python main.py
我发现了异常 运行结果< 1 >是正确的,但我就想抛个异常出来
我还能继续运行到程序结束

在Go中,我们通过panic来实现类似的效果

package main

import "fmt"

func calc(s int) {
// 定义一个延迟执行的匿名函数
defer func() {
// 捕获异常,并赋值给变量。相当于python中except部分的功能
if err := recover(); err != nil {
fmt.Println("我发现了异常: ", err)
}
}()

ret := 5 / s
fmt.Println("运行结果是: ", ret)
// 主动抛出异常信息,会被recover()捕获到,相当于python中raise关键字的作用
panic("运行结果是正确的,但我就想抛个异常出来")
}

func main() {

calc(5)

fmt.Println("我还能继续运行到程序结束")
}

运行结果

% go run main.go
运行结果是: 1
我发现了异常: 运行结果是正确的,但我就想抛个异常出来
我还能继续运行到程序结束


举报

相关推荐

0 条评论