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
我发现了异常: 运行结果是正确的,但我就想抛个异常出来
我还能继续运行到程序结束