当前位置: 首页 > 知识库问答 >
问题:

如何在golang的defer func(){...}()中使panic发生并处理时使方法返回值

云新知
2023-03-14
func getDBStoreStatus() string{
    var replyMessage string
    defer func() string{ 
        if err := recover(); err != nil {  
            replyMessage = "Error happend." 
        }
    return replyMessage
    }()

    //do something to store row into DB
    db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8") 
    newMessage, err := db.Prepare("INSERT .............
    res, err := newMessage.Exec(...........
    if err != nil { 
        panic(err)
    }
    replyMessage = "OK"
    return replyMessage
}

如果panic被defer部分处理,我如何返回字符串?您可以看到defer部分中的return语句不能正常工作。

共有1个答案

史淇
2023-03-14

命名返回参数,然后可以在defer方法中设置它:

func getDBStoreStatus() (replyMessage string) {
    defer func(){ 
        if err := recover(); err != nil {  
            replyMessage = "Error happend." 
        }
    }()

    //do something to store row into DB
    db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8") 
    newMessage, err := db.Prepare("INSERT .............
    res, err := newMessage.Exec(...........
    if err != nil { 
        panic(err)
    }
    replyMessage = "OK"
    return replyMessage
}

参见Go博客关于推迟、恐慌和恢复的帖子:

延迟函数可以读取并分配给返回函数的命名返回值。

func c() (i int) {
    defer func() { i++ }()
    return 1
}
    if err != nil { 
        return "Error happend."
    }
 类似资料:
  • 本文向大家介绍ThinkPHP处理Ajax返回的方法,包括了ThinkPHP处理Ajax返回的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ThinkPHP处理Ajax返回的方法,分享给大家供大家参考。具体实现方法如下: 在ThinkPHP中可以直接使用ajax返回: 而在处理过程中可以使用这个函数处理: 希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

  • 问题内容: 场景 :考虑以下是节点Web应用程序的代码部分。 问题 :我正在检查公正或公正哪一个。上面的示例代码对两者的工作原理完全相同,并且在执行方面没有任何区别。 问题 : 有人 可以对此加以说明,何时使用和何时使用以及一些重要的区别吗? 问题答案: 有人总是写是为了确保执行在触发回调后停止。 如果您不这样做,则可能要冒第二次触发回调的风险,这通常会造成灾难性的后果。您的代码可以正常使用,但我

  • 问题内容: 给出以下代码: 我可以假设’dowork’函数将并行执行吗? 这是实现并行性的正确方法,还是对每个goroutine使用通道并将单独的“ workwork”工人分开更好? 问题答案: 关于GOMAXPROCS,您可以在Go 1.5的发行文档中找到: 默认情况下,Go程序在将GOMAXPROCS设置为可用内核数的情况下运行;在以前的版本中,它默认为1。 关于防止main功能立即退出,您可

  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了

  • 我想有一个方法公共布尔verfySignIn()并在里面调用下面的方法并返回true, setUserName(String)此方法用于设置用户名。setPassword(字符串)此方法用于设置密码。clickLogin()此方法用于单击login按钮。 这是我的代码现在的样子,

  • 问题内容: 我正在使用具有以下签名的类: 我正试图通过其他班级来称呼它: 但是在这里我得到这个错误: 为什么在Class扩展行中将我指定为第三个参数? 问题答案: 您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成同步任务。 由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中