Golang中的panic之避免和處理程序中的異常情況
1.panic是什么
panic() 是一個內建的函數(shù)
2.panic有什么用
作用:可以使用panic停止程序繼續(xù)運行,所以大多數(shù)都是在demo中使用,項目中盡量少使用,畢竟我們不能讓我們的項目突然退出了。
1.首先我們來看下面的這段代碼
package main
import "fmt"
func main() {
fmt.Println("main開始")
fmt.Println("main結束")
}
這是一段非常簡單的代碼,運行結果如下,我們可以看到整個程序正常的運行然后結束了。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
main結束
2.我們試試添加panic函數(shù)
package main
import "fmt"
func main() {
fmt.Println("main開始")
panic("這是一個panic") //第8行
fmt.Println("main結束")
}
結果如下,我們看到當panic函數(shù)運行之后,后面的代碼就不在執(zhí)行了,主程序main退出。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
panic: 這是一個panicgoroutine 1 [running]:
main.main()
/home/yantao/go/src/panic_learn/main.go:8 +0x65
exit status 2
3.如果panic出現(xiàn)在被調用者內呢
package main
import "fmt"
func main() {
fmt.Println("main開始")
fun1()
panic("這是一個panic")
fmt.Println("main結束")
}
func fun1() {
fmt.Println("fun1開始")
panic("這是一個fun1的panic") //第17行
fmt.Println("fun1結束")
}
我們發(fā)現(xiàn)程序在17行運行之后,fun1停止向下繼續(xù)運行了,而且調用者main也停止在調用fun1的地方了,并且退出了主程序main函數(shù)。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
fun1開始
panic: 這是一個fun1的panicgoroutine 1 [running]:
main.fun1()
/home/yantao/go/src/panic_learn/main.go:17 +0x65
main.main()
/home/yantao/go/src/panic_learn/main.go:7 +0x57
exit status 2
內建函數(shù)panic停止當前Go程的正常執(zhí)行。當函數(shù)fun1調用panic時,fun1的正常執(zhí)行就會立刻停止。fun1返回給其調用者G。G如同fun1一樣行動,層層返回,直到主函數(shù)main。然后程序被終止,然后打印該恐慌的實參值(“這是一個fun1的panic”)。
下面的代碼也出現(xiàn)了panic
package main
import (
"fmt"
)
func main() {
fmt.Println("main開始")
div()
fmt.Println("main結束") //第17行
}
func div() {
var a = 5
var b = 0
res := a /b
fmt.Println(res)
}
由于panic,程序停止了
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
panic: runtime error: integer divide by zerogoroutine 1 [running]:
main.div()
/home/yantao/go/src/panic_learn/main.go:19 +0x11
main.main()
/home/yantao/go/src/panic_learn/main.go:10 +0x5b
exit status 2
但是我們不想因為div的錯誤讓main停止,讓第12行也能繼續(xù)運行。這就引出了 defer…recover
3.defer…recover
defer…recover用來捕獲錯誤,defer 后面跟上匿名函數(shù)的調用,程序不會因為panic而中斷。
package main
import (
"fmt"
)
func main() {
fmt.Println("main開始")
div()
fmt.Println("main結束") //第12行
}
func div() {
defer func() {
err := recover()
if err != nil {
//err確實存在
fmt.Println("捕獲到錯誤啦,錯誤是:",err)
}
}()
var a = 5
var b = 0
res := a /b
fmt.Println(res)
}
我們看到main函數(shù)能夠繼續(xù)執(zhí)行了,沒有被中斷。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
捕獲到錯誤啦,錯誤是: runtime error: integer divide by zero
main結束
到此這篇關于Golang中的panic之避免和處理程序中的異常情況的文章就介紹到這了,更多相關Golang panic內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go?defer?return?panic?執(zhí)行順序示例詳解
這篇文章主要介紹了go?defer?return?panic?執(zhí)行順序,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01
golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別
這篇文章主要介紹了golang 函數(shù)以及函數(shù)和方法的區(qū)別的相關資料,需要的朋友可以參考下2017-05-05

