
为啥下面这段代码,未捕获到 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 Jul 25, 2025 除零不可以被 recover 的,类似的还有并发 map |
2 Vegetable Jul 25, 2025 不是,你上边的写法都没编译成功,没有真正的运行。 |
3 SethShi Jul 25, 2025 楼上说的对, 你那个是编译检查错误, 不是运行时错误, 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 |