Go 语言的异常处理是如何实现的?
Go 语言的异常处理是如何实现的?
提示
题眼: 链式存储,协程独立
异常处理的目的是保证程序的健壮性和稳定性,避免程序崩溃或产生不可预期的错误。Go 语言通常使用 panic 和 recover 处理异常。
panic可以由运行时触发,也可以由程序员主动调用。一旦触发,就会沿当前调用栈逐层回退。recover只能在defer中生效,而且必须是在当前正在发生panic的时候调用,否则返回nil。panic和recover都是针对当前goroutine生效的,不同协程之间不能互相恢复对方的panic。- 运行时在处理
panic时,会依次执行当前协程中的延迟调用;如果最终没有被恢复,就会打印调用栈并退出程序。
重要
参考答案:panic 的触发一般有两种情况:一种是代码本身出现了严重错误,比如数组越界、空指针解引用;另一种是程序员主动调用了 panic。无论哪一种,如果不处理,它都会沿着当前调用栈一路向上,最后导致程序退出。panic 处理过程中,运行时会去执行当前协程里已经注册的 defer。如果某个 defer 里调用了 recover,并且调用位置正确,那么这次 panic 就会被恢复,程序可以继续往下执行;如果没有被恢复,运行时就会打印错误信息和调用栈,然后结束程序。
这里要特别注意两点:第一,recover 必须写在 defer 里才会生效;第二,recover 只能处理当前协程中的 panic,没法跨协程捕获。
