Что произойдет, если произойдет ошибка, и мое приложение golang ее не обработает?

В настоящее время я использую gorm и 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 и будет ли оно работать должным образом?


person John Kenn    schedule 01.01.2016    source источник


Ответы (3)


В следующем примере выше обрабатывается только ошибка 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")
} 

or

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

Я не рекомендую панический метод. Если вам интересно, погуглите, почему.

person Thellimist    schedule 01.01.2016
comment
Дополнительная информация для других: при использовании фреймворка gin, когда происходит паника, он автоматически отвечает с ошибкой внутреннего сервера 500. - person John Kenn; 15.01.2016

У Go нет исключений. Вместо того, чтобы перехватывать исключения, вы получаете ошибки через значения, возвращаемые функциями. Таким образом, за кулисами не происходит бросания или чего-то особенного, только функция, которая возвращает значение ошибки, и, как и любое другое возвращаемое значение, вы можете отказаться от нее.

Однако я бы не рекомендовал отказываться от ошибок. Если вам лень или вы теряетесь в том, что делать с ошибкой - просто зарегистрируйте ее:

log.Error(err)

Вы никогда не знаете, является ли ошибка, которую вы отбросили, причиной этой загадочной ошибки, которая, как вы можете поклясться, исходить откуда угодно, кроме вашего собственного кода.

person Zippo    schedule 01.01.2016

Интересно, что произойдет, если произойдет ошибка, и мое приложение ее не обработает?

Тогда состояние приложения не определено. Если вы не проверяете значения ошибок, ваше приложение будет использовать значения, которые не определены (возможно, ноль для указателей и «нули» для значений) или предполагая, что этот побочный эффект произошел, но может и не быть.

Допустим, у вас есть функция с подписью func CreateStruct() (T, err) и вы вызываете ее так t, _ := CreateStruct() (без проверки на наличие ошибок), вы не должны ожидать, что переменная t будет иметь правильное значение. Если у вас есть такая функция, как func Update() err, и вы вызываете ее без проверки ошибок, вы не можете узнать, было ли выполнено обновление или нет.

Конечно, все зависит от API и реализации. Но ты получил идею.

но что, если это приведет к другой ошибке?

Это невозможно. В Go нет механизма выдачи ошибок. Ошибка может быть возвращена только как нормальное значение.


Вы не должны никогда лениться с ошибками. Это очень важная часть программирования, и Go упрощает ее реализацию.

person kopiczko    schedule 01.01.2016