Go语言 如何处理延迟函数中的错误?

xriantvc  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(82)
func someFunc() (err error) {
    defer func(err_ error) {
        r.handleErrOrPanic(err_, obj) 
    }(err) // err is always nil here
    err = ThrowErrOrPanic(ctx, obj)
    return err
}

我想使用handleErrOrPanic作为延迟函数来处理错误或死机。我必须在ThrowErrOrPanic之前定义它,因为deferred函数必须处理panic。但是,如果我在err之前定义它,它总是nil。我该怎么解决这个问题?

m3eecexj

m3eecexj1#

在deferred函数中,使用周围函数的 named return value,即使用err而不是err_。如果你遇到了panic,并且你想从它中恢复,在deferred函数中使用recover()

func someFunc() (err error) {
    defer func() {
        if x := recover(); x != nil { // panic occurred?
            // handle panic
        } else if err != nil { // a plain error occurred?
            // handle error
        } else {
            // all good
        }
    }()

    err = ThrowErrOrPanic(ctx, obj)
    return err
}

https://go.dev/play/p/miTr-lN1Y9R

相关问题