Go语言panic和recover的用法实例
作者:飞翔的乌龟
panic()和recover()是Go语言中用于处理错误的两个重要函数,本文主要介绍了Go语言panic和recover的用法实例,panic()用于中止程序并引发panic,而recover()用于捕获panic并恢复程序的执行,感兴趣的可以了解一下
panic()
和 recover()
是 Go 语言中用于处理错误的两个重要函数。panic()
函数用于中止程序并引发panic,而 recover()
函数用于捕获panic并恢复程序的执行。
什么是panic和recover?
panic
panic()
函数用于中止程序并引发panic。panic()
函数可以接收一个参数,该参数将作为panic的原因。- 当发生panic时,程序将停止执行,并开始寻找最近的recover调用。
- 如果找不到recover调用,程序将打印panic的原因并退出。
recover
recover()
函数用于捕获panic并恢复程序的执行。recover()
函数可以接收一个参数,该参数将存储panic的原因。- 如果在发生panic时调用了recover,程序将继续执行,并且panic的原因将被存储在recover的第一个参数中。
func main() { defer func() { err := recover() if err != nil { fmt.Println("panic:", err) } }() panic("hello, panic!") }
panic 的传播
panic 函数会向上传播到调用它的 goroutine。如果 panic 函数没有被捕获,则会一直向上传播,直到遇到 defer
语句中调用的 recover()
函数,或者程序退出。
注意事项
跨协程失效
panic
和 recover
不能跨协程使用。这意味着在一个协程中发生的panic只能在同一个协程中通过 recover
捕获。如果在一个协程中发生了panic,而在另一个协程中调用了 recover
,那么 recover
将无法捕获panic。参考如下代码:
func main() { defer println("in main") go func() { defer println("in goroutine") panic("") }() time.Sleep(1 * time.Second) }
失效的崩溃恢复
如果在一个defer函数中发生了panic,那么该defer函数后面的语句将不会被执行。这意味着在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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- Go panic和recover函数使用细节深入探究
- Go中的 panic / recover 简介与实践记录
- 一文带你掌握Golang中panic与recover的使用方法
- GoLang中panic与recover函数以及defer语句超详细讲解
- Golang中panic与recover的区别
- Golang异常处理之defer,panic,recover的使用详解
- Golang 错误捕获Panic与Recover的使用
- 小学生也能看懂的Golang异常处理recover panic
- Go中recover与panic区别详解
- go语言的panic和recover函数用法实例
- go语言异常panic和恢复recover用法实例