Golang中的panic之避免和處理程序中的異常情況
1.panic是什么
panic() 是一個(gè)內(nèi)建的函數(shù)
2.panic有什么用
作用:可以使用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.我們?cè)囋囂砑觩anic函數(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í)行就會(huì)立刻停止。fun1返回給其調(diào)用者G。G如同fun1一樣行動(dòng),層層返回,直到主函數(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
3.defer…recover
defer…recover用來捕獲錯(cuò)誤,defer 后面跟上匿名函數(shù)的調(diào)用,程序不會(huì)因?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é)束
到此這篇關(guān)于Golang中的panic之避免和處理程序中的異常情況的文章就介紹到這了,更多相關(guān)Golang panic內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang網(wǎng)絡(luò)通信超時(shí)設(shè)置方式
這篇文章主要介紹了golang網(wǎng)絡(luò)通信超時(shí)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
goland 設(shè)置project gopath的操作
這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Go語言與gRPC的完美結(jié)合實(shí)戰(zhàn)演練
這篇文章主要介紹了Go語言與gRPC的完美結(jié)合實(shí)戰(zhàn)演練,gRPC(Remote?Procedure?Call)是一種遠(yuǎn)程過程調(diào)用技術(shù),通過壓縮和序列化數(shù)據(jù)來優(yōu)化網(wǎng)絡(luò)通信,可以顯著提高服務(wù)調(diào)用的性能和效率2024-01-01
Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件
這篇文章主要介紹了Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
GoLang channel底層代碼實(shí)現(xiàn)詳解
Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要梳理一下GoLang channel底層代碼實(shí)現(xiàn)2022-10-10
GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)
這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語言小白的掃盲文,主要講解了go語言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下2022-12-12
GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)
這是 2020 年第 3 個(gè)版本,也是最后一個(gè)版本,你還將發(fā)現(xiàn)許多新的代碼編輯功能,具體內(nèi)容詳情跟隨小編看看有哪些新特性2020-12-12

