Go语言 在没有恢复的情况下检查恐慌

u0sqgete  于 12个月前  发布在  Go
关注(0)|答案(3)|浏览(115)

在一个defer函数中,我想看看调用recover是否会产生一个非nil的值(没有recover)
这可能吗?

hjzp0vay

hjzp0vay1#

这是不可能的,你可能只是想重新恐慌,基本上就像在其他语言中重新抛出一个异常;

defer func() {
             if e := recover(); e != nil {
                 //log and so other stuff
                 panic(e)
             }
          }()

字符串

7vhp5slm

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必须作为函数体中的最后一条语句。如果函数有多个返回值,它必须是每个返回值之前的最后一条语句。

vecaoik1

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)
}

字符串

相关问题