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

What would happen if an error happened and my golang app didn't handle it?

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

示例:

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 服务器内部错误吗?应用程序是否会继续 运行 正常运行?

In the next example above, only the RecordNotFound() error is being handled, but what if it throws a different error?

如果您没有捕获到错误,它将继续处理代码。错误不是特殊类型,它很简单 struct

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.  

Will my app automatically respond with a 500 server internal error and will the app keep on running properly?

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

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

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

我不推荐 panic 方法。如果你很好奇 google 为什么。

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

虽然我不建议丢弃错误。如果您对如何处理错误感到懒惰或不知所措 - 只需将其记录下来:

log.Error(err)

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

I wonder what would happen if an error happened and my app didn't handle it?

那么应用的状态是未定义的。如果您不检查错误值,您的应用程序将使用未定义的值(对于指针可能为 nil,对于值可能为 "zeros")或假设发生了副作用,但它可能不会。

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

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

but what if it throws a different error?

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


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