为啥下面这段代码,未捕获到 panic
package main
import "fmt"
func main() {
defer func() {
fmt.Println("-----") // 未执行
if err := recover(); err != nil {
fmt.Println("捕获到 panic:", err)
}
}()
1 / 0
}
// 输出:
// # command-line-arguments
// ./a.go:11:9: invalid operation: division by zero
而手动抛出 panic ,则可以被捕获到
package main
import "fmt"
func main() {
defer func() {
fmt.Println("-----") // 执行
if err := recover(); err != nil {
fmt.Println("捕获到 panic:", err)
}
}()
panic("+++++")
}
// 输出:
// -----
// 捕获到 panic: +++++
1
Rickkkkkkk 6 天前
除零不可以被 recover 的,类似的还有并发 map
|
![]() |
2
Vegetable 6 天前
不是,你上边的写法都没编译成功,没有真正的运行。
|
![]() |
3
seth19960929 6 天前
楼上说的对, 你那个是编译检查错误, 不是运行时错误, 1/0 是可以被捕获成功的, 骗一下编译器
package main import ( "fmt" ) func main() { defer func() { if err := recover(); err != nil { fmt.Println("捕获到 panic:", err) // 会执行 } }() // 通过变量绕过编译器的除零检查 a, b := 1, 0 _ = a / b // 运行时 panic: integer divide by zero } |
![]() |
4
yezheyu OP |