Can a Caller Function Recover from a Child Goroutine Panic?
Nov 04, 2024 am 08:21 AMCaller Function Recovery from Child Goroutine Panics
Contrary to popular belief, a goroutine's panic does not necessarily terminate the entire program. This misconception stems from the assumption that deferred recovery functions in the caller will handle the panic. However, this is not the case if the caller finishes before the panic occurs in the goroutine.
Consider the following example:
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
Despite the caller function (fun1) finishing execution, the program still terminates if fun2 panics. This occurs because the Go specification defines that when a panic occurs in a goroutine:
- The execution of that goroutine terminates.
- The deferred functions called by that goroutine execute.
- The deferred functions of its caller execute.
In this case, fun2 is the top-level function in the goroutine, and it does not recover from the panic. Therefore, the program terminates.
The key point is that:
A goroutine cannot recover from a panic that occurs in another goroutine.
The above is the detailed content of Can a Caller Function Recover from a Child Goroutine Panic?. For more information, please follow other related articles on the PHP Chinese website!

Hot Article

Hot tools Tags

Hot Article

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Go language pack import: What is the difference between underscore and without underscore?

How to implement short-term information transfer between pages in the Beego framework?

How do I write mock objects and stubs for testing in Go?

How can I use tracing tools to understand the execution flow of my Go applications?

How to convert MySQL query result List into a custom structure slice in Go language?

How can I define custom type constraints for generics in Go?

How to write files in Go language conveniently?

How do I write benchmarks that accurately reflect real-world performance in Go?
