go - 如何知道延迟函数是在成功执行函数后调用还是被 panic 调用

标签 go deferred panic

我需要在 defer 函数中写一些业务逻辑。 defer 中的控制流应该根据 defer 是在系统 panic 之后执行还是在函数执行成功之后执行。

package main

import "log"

func b() {
    panic("panicked in b")
}
func a() {

    b()
}
func main() {
    defer func() {
     // If panicked 
         log.Println("panicked")
         // if called after function successfully executed
         log.Println("Success")
         /* 
            How to understand if defer is triggered by panic or after function returned successfully.
         */
    }()
    a()
    log.Println("main code")
}

预期:Defer 应该能够通过任何可能的方式知道它被 panic 调用

最佳答案

您可以使用recover 来捕获 panic :

defer func() {
    if err := recover(); err != nil {
        fmt.Println("panic")
    } else {
        fmt.Println("successful")
    }
}()

关于go - 如何知道延迟函数是在成功执行函数后调用还是被 panic 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541086/

相关文章:

macos - Mac 内核崩溃,现在 Android Studio 项目将无法运行

elasticsearch - 使用 go 在 elasticsearch 中进行大量更新

html - 将图像从 html 表单传递到 Go

dojo - 在 Dojo JSONP 请求之后,响应存储在哪里?

javascript - jQuery 推迟了 : Nesting promises in methods, 最后一次回调太早

go - 为什么 go panic recover to return value with local variable 不起作用?

go - 递归数据结构解码在 Go Lang Protobuf 中给出错误 "cannot parse invalid wire-format data"

SQLite 3 没有在 Golang 中释放内存

javascript - 使用 Q promise 库不按顺序执行 Promise 链

iterator - 我可以将 Iterator<Item=io::Result<u8>> 转换为 io::Result<Vec<u8>> 而不 panic 吗?