2

我目前正在使用gormgin 框架。我想知道如果发生错误并且我的应用程序没有处理它会发生什么?

例子:

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
    // error handling...
}

在上面的示例中,正在处理错误。

if db.Model(&user).Related(&credit_card).RecordNotFound() {
    // no credit card found error handling
}

在上面的下一个示例中,只RecordNotFound()处理了错误,但如果它抛出不同的错误怎么办?会发生什么?

我的应用程序会自动响应 500 服务器内部错误,并且应用程序会继续正常运行吗?

4

3 回答 3

2

在上面的下一个示例中,只处理了 RecordNotFound() 错误,但如果它引发不同的错误怎么办?

如果您没有发现错误,它将在代码上继续。错误不是特殊类型,它是一个简单的结构

err := FunctionThatReturnsError()  
if err == myError.RecordNotFound() { // if err is not RecordNotFound then it won't enter the if simple as that. 
    // Do something.  
}  

// continue code.  

我的应用程序会自动响应 500 服务器内部错误,并且应用程序会继续正常运行吗?

如果 go 例程没有恐慌或您返回响应,则不会有响应。如果你想处理它,你可以这样做:

err := FunctionThatReturnsError()  
if err == myError.RecordNotFound() {
      panic("RecordNotFound")
} 

或者

err := FunctionThatReturnsError()  
if err == myError.RecordNotFound() {
      c.JSON(500, "Record not found"}
} 

我不推荐恐慌方法。如果你好奇谷歌为什么。

于 2016-01-01T09:52:59.370 回答
2

Go 没有例外。您不是捕获异常,而是通过函数的返回值获取错误。所以在幕后没有抛出或任何特殊情况,只是一个返回错误值的函数,就像任何其他返回值一样 - 你可以丢弃它。

不过,我不建议丢弃错误。如果您对如何处理错误感到懒惰或迷失 - 只需记录它:

log.Error(err)

您永远不知道您丢弃的错误是否导致了这个您可以发誓的神秘错误来自您自己的代码以外的任何地方。

于 2016-01-01T13:03:12.677 回答
1

我想知道如果发生错误并且我的应用程序没有处理它会发生什么?

然后应用程序的状态是未定义的。如果您不检查错误值,您的应用程序将使用未定义的值(指针可能为 nil,值可能为“零”)或假设发生了副作用但可能不会。

假设您有一个带有签名的函数func CreateStruct() (T, err) 并像这样调用它t, _ := CreateStruct()(不检查错误),您不应该期望t变量具有正确的值集。如果您有类似的功能func Update() err并且您在没有错误检查的情况下调用它,那么您将无法知道是否执行了更新。

当然,一切都取决于 API 和实现。但你明白了。

但是如果它抛出一个不同的错误呢?

不可能。Go 中没有抛出错误机制。错误只能作为正常值返回。


永远不应该懒惰地处理错误。它是编程中非常重要的一部分,Go 让它更容易实现。

于 2016-01-01T22:24:15.913 回答