在编写程序的时候很容易遇见的一个问题,也是必须要处理的,今天简单的去了解了一下什么是错误什么是异常,在go中是如何处理的
错误异常
在了解怎么做之前,我们首先应该要明白,什么是错误,什么是异常
- 错误:可以预测
- 异常:不可预测
在程序的编码中,我们写的代码有时候我们知道他可能会出现什么错,那么我们就叫做错误,比如说我们写的这个代码:
func pan(i int) {
if i == 0 {
err := fmt.Sprintf("i 不能为 0 ", time.Now())
panic(err)
}
}
如果我们用这个判断除数的话,那么可以知道除数是不能为0的,如果出现了除数为0那么他肯定是错误的,这种可以预测的,我们称之为错误。其他的错误是我们没有预测那么那些错误就是异常。感觉说的有点小绕。
其实简单的就是,预测的叫做错误没有预测的就是异常。
如何进行处理
在go中如果我们执行了panic,我们会得到下面这种结构。首先我们来看一下我们执行的代码:
func main() {
pan(0)
fmt.Println("main安全退出")
}
func pan(i int) {
if i == 0 {
err := fmt.Sprintf("i 不能为 0 ", time.Now())
panic(err)
}
}
这里我们输入了0,那么肯定是会执行panic函数的,那么执行了panic函数过后程序就会直接被终止,所以我们会得到下面这个结果。
/private/var/folders/55/2cf9m54s36q_1yf2j1svkf580000gn/T/GoLand/___go_build_awesomeProject1_2022_4_9_PanicAndRecover
panic: i 不能为 0 %!(EXTRA time.Time=2022-04-09 11:19:17.141969 +0800 CST m=+0.000072167)
goroutine 1 [running]:
main.pan(0x0)
/Users/lizhongzheng/GolandProjects/awesomeProject1/2022-4-9/PanicAndRecover/main.go:16 +0xd0
main.main()
/Users/lizhongzheng/GolandProjects/awesomeProject1/2022-4-9/PanicAndRecover/main.go:9 +0x24
这里会清楚的写到在那里执行执行了panic,然后panic的错误是什么等相关信息。
但是我们这里就会产生一个疑问,如果我们的程序正在运行但是不想让这个Panic将我们的程序直接终止,我们应该怎么处理。我们看到这里的结果是直接终止了程序的执行,最后是没有回到主函数执行输出的。
对着这种处理,在php和java中使用有try catch这个方法进行处理,但是在go中是没有的,那么应该如果进行类似的处理呢?
这里我们就要使用到一个recover()函数了,这个函数和panic一般都是一起出现的,这个函数的作用就是处理panic报的错误,然后收集不让程序直接退出。
这里我们来演示一下有recover这个函数后,程序的执行吧,还是先上我们执行的源码:
func main() {
pan(0)
fmt.Println("main安全退出")
}
func pan(i int) {
defer func() {
if err := recover(); err != nil {
fmt.Println("检测到错误", err)
} else {
panic("检测失败")
}
}()
if i == 0 {
err := fmt.Sprintf("i 不能为 0 ", time.Now())
panic(err)
}
}
这个我们使用的defer,延迟处理函数,然后在这里return前进行一个调用,对于defer函数在以后我们再进行讲解,在这里我们知道它是延迟处理就可以了。
然后下面是我们的执行结果:
/private/var/folders/55/2cf9m54s36q_1yf2j1svkf580000gn/T/GoLand/___go_build_awesomeProject1_2022_4_9_PanicAndRecover
检测到错误 i 不能为 0 %!(EXTRA time.Time=2022-04-09 11:27:48.221554 +0800 CST m=+0.000130459)
<!-- more -->
main安全退出
不错我们执行到了最后,main函数安全退出,我们就演示到这里了,这就是go处理错误和异常的方法了。