在编写程序的时候很容易遇见的一个问题,也是必须要解决的,明天简略的去理解了一下什么是谬误什么是异样,在 go 中是如何解决的
<!– more –>
谬误异样
在理解怎么做之前,咱们首先应该要明确,什么是谬误,什么是异样
- 谬误:能够预测
-
异样:不可预测
在程序的编码中,咱们写的代码有时候咱们晓得他可能会呈现什么错,那么咱们就叫做谬误,比如说咱们写的这个代码: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 处理错误和异样的办法了。