Go語言panic和recover的用法實例
panic() 和 recover() 是 Go 語言中用于處理錯誤的兩個重要函數。panic() 函數用于中止程序并引發(fā)panic,而 recover() 函數用于捕獲panic并恢復程序的執(zhí)行。
什么是panic和recover?
panic
panic()函數用于中止程序并引發(fā)panic。panic()函數可以接收一個參數,該參數將作為panic的原因。- 當發(fā)生panic時,程序將停止執(zhí)行,并開始尋找最近的recover調用。
- 如果找不到recover調用,程序將打印panic的原因并退出。
recover
recover()函數用于捕獲panic并恢復程序的執(zhí)行。recover()函數可以接收一個參數,該參數將存儲panic的原因。- 如果在發(fā)生panic時調用了recover,程序將繼續(xù)執(zhí)行,并且panic的原因將被存儲在recover的第一個參數中。
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println("panic:", err)
}
}()
panic("hello, panic!")
}panic 的傳播
panic 函數會向上傳播到調用它的 goroutine。如果 panic 函數沒有被捕獲,則會一直向上傳播,直到遇到 defer 語句中調用的 recover() 函數,或者程序退出。
注意事項
跨協(xié)程失效
panic 和 recover 不能跨協(xié)程使用。這意味著在一個協(xié)程中發(fā)生的panic只能在同一個協(xié)程中通過 recover 捕獲。如果在一個協(xié)程中發(fā)生了panic,而在另一個協(xié)程中調用了 recover,那么 recover 將無法捕獲panic。參考如下代碼:
func main() {
defer println("in main")
go func() {
defer println("in goroutine")
panic("")
}()
time.Sleep(1 * time.Second)
}失效的崩潰恢復
如果在一個defer函數中發(fā)生了panic,那么該defer函數后面的語句將不會被執(zhí)行。這意味著在defer函數中使用 recover 來捕獲panic是無效的。
func main(){
defer fmt.Println("main....")
defer func() {
err := recover()
if err != nil {
fmt.Println("panic:", err)
}
}()
panic("hello, panic!")
}嵌套崩潰
嵌套崩潰是指在一個 goroutine 中調用 panic() 函數,然后在 defer 語句中再次調用 panic() 函數。在這種情況下,panic() 函數會從內向外傳播,直到程序崩潰。嵌套崩潰可能會導致程序不可用,因此應避免使用。
func multiplePanic() {
defer fmt.Println("in defer")
defer func() {
defer func() {
panic("panic 3")
}()
panic("panic 2")
}()
panic("panic 1")
}到此這篇關于Go語言panic和recover的用法實例的文章就介紹到這了,更多相關Go語言panic和recover內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
通過函數如何將golang?float64?保留2位小數(方法匯總)
這篇文章主要介紹了通過函數將golang?float64保留2位小數,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

