在一个defer函数中,我想看看调用recover是否会产生一个非nil的值(没有recover)这可能吗?
hjzp0vay1#
这是不可能的,你可能只是想重新恐慌,基本上就像在其他语言中重新抛出一个异常;
defer func() { if e := recover(); e != nil { //log and so other stuff panic(e) } }()
字符串
7vhp5slm2#
你可以设置一个bool标志,然后在函数体的末尾重置它。如果这个标志仍然在defer中被设置,你就知道最后一条语句没有执行。唯一可能的原因是函数正在恐慌。https://play.golang.org/p/PKeP9s-3tF
func do() { panicking := true defer func() { if panicking { fmt.Println("recover would return !nil here") } }() doStuff() panicking = false }
字符串缺点是增加了维护负担,因为panicking = false必须作为函数体中的最后一条语句。如果函数有多个返回值,它必须是每个返回值之前的最后一条语句。
panicking = false
vecaoik13#
解决方案没有“直接”路径
package main import( "fmt" "runtime" "regexp" ) var re_runtimepanicdetector *regexp.Regexp = regexp.MustCompile("runtime/panic.go$"); func tester_for_panic( deferdepth int )bool{ _,file,_,_ := runtime.Caller(deferdepth+3) return re_runtimepanicdetector.MatchString(file) } func tester_for_panic_worktest() bool { defer func(){ recover() ; if !tester_for_panic(0) { panic("tester_for_panic: NOT WORK!!") } }(); panic(1) } var Iswork_tester_for_panic bool= tester_for_panic_worktest(); func testp( dopanic bool ) { defer func() { fmt.Println("defer panic=", tester_for_panic(0)) ; recover() // optional }() if (dopanic) { panic("test") } } func main(){ testp(true) testp(false) }
3条答案
按热度按时间hjzp0vay1#
这是不可能的,你可能只是想重新恐慌,基本上就像在其他语言中重新抛出一个异常;
字符串
7vhp5slm2#
你可以设置一个bool标志,然后在函数体的末尾重置它。如果这个标志仍然在defer中被设置,你就知道最后一条语句没有执行。唯一可能的原因是函数正在恐慌。
https://play.golang.org/p/PKeP9s-3tF
字符串
缺点是增加了维护负担,因为
panicking = false
必须作为函数体中的最后一条语句。如果函数有多个返回值,它必须是每个返回值之前的最后一条语句。vecaoik13#
解决方案没有“直接”路径
字符串