您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Golang怎么使用panic控制程序錯(cuò)誤”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
panic() 是一個(gè)內(nèi)建的函數(shù)
作用:可以使用panic停止程序繼續(xù)運(yùn)行,所以大多數(shù)都是在demo中使用,項(xiàng)目中盡量少使用,畢竟我們不能讓我們的項(xiàng)目突然退出了。
1.首先我們來看下面的這段代碼
package main import "fmt" func main() { fmt.Println("main開始") fmt.Println("main結(jié)束") }
這是一段非常簡單的代碼,運(yùn)行結(jié)果如下,我們可以看到整個(gè)程序正常的運(yùn)行然后結(jié)束了。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
main結(jié)束
2.我們試試添加panic函數(shù)
package main import "fmt" func main() { fmt.Println("main開始") panic("這是一個(gè)panic") //第8行 fmt.Println("main結(jié)束") }
結(jié)果如下,我們看到當(dāng)panic函數(shù)運(yùn)行之后,后面的代碼就不在執(zhí)行了,主程序main退出。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
panic: 這是一個(gè)panicgoroutine 1 [running]:
main.main()
/home/yantao/go/src/panic_learn/main.go:8 +0x65
exit status 2
3.如果panic出現(xiàn)在被調(diào)用者內(nèi)呢
package main import "fmt" func main() { fmt.Println("main開始") fun1() panic("這是一個(gè)panic") fmt.Println("main結(jié)束") } func fun1() { fmt.Println("fun1開始") panic("這是一個(gè)fun1的panic") //第17行 fmt.Println("fun1結(jié)束") }
我們發(fā)現(xiàn)程序在17行運(yùn)行之后,fun1停止向下繼續(xù)運(yùn)行了,而且調(diào)用者main也停止在調(diào)用fun1的地方了,并且退出了主程序main函數(shù)。
yantao@hasee:~/go/src/panic_learn$ go run main.go
main開始
fun1開始
panic: 這是一個(gè)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
內(nèi)建函數(shù)panic停止當(dāng)前Go程的正常執(zhí)行。當(dāng)函數(shù)fun1調(diào)用panic時(shí),fun1的正常執(zhí)行就會立刻停止。fun1返回給其調(diào)用者G。G如同fun1一樣行動,層層返回,直到主函數(shù)main。然后程序被終止,然后打印該恐慌的實(shí)參值(“這是一個(gè)fun1的panic”)。
下面的代碼也出現(xiàn)了panic
package main import ( "fmt" ) func main() { fmt.Println("main開始") div() fmt.Println("main結(jié)束") //第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
但是我們不想因?yàn)閐iv的錯(cuò)誤讓main停止,讓第12行也能繼續(xù)運(yùn)行。這就引出了 defer…recover
defer…recover用來捕獲錯(cuò)誤,defer 后面跟上匿名函數(shù)的調(diào)用,程序不會因?yàn)閜anic而中斷。
package main import ( "fmt" ) func main() { fmt.Println("main開始") div() fmt.Println("main結(jié)束") //第12行 } func div() { defer func() { err := recover() if err != nil { //err確實(shí)存在 fmt.Println("捕獲到錯(cuò)誤啦,錯(cuò)誤是:",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開始
捕獲到錯(cuò)誤啦,錯(cuò)誤是: runtime error: integer divide by zero
main結(jié)束
“Golang怎么使用panic控制程序錯(cuò)誤”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。