2016-03-13 2 views
-1

Я следую этому примеру здесь:Как проверить точный тип ошибки при восстановлении?

https://www.socketloop.com/tutorials/golang-smarter-error-handling-with-strings-contains-function

if !strings.Contains(err.Error(), "timed out") { 
    fmt.Printf("resulting error not a timeout: %s", err) 
} 

Однако, если я делаю это в моем коде я получаю это

err.Error Неопределенный (типа интерфейс {} является интерфейсом без методов)

Интересно, что я здесь делаю неправильно, и как я должен проверить п точная ошибка (в моем случае, если я хочу, чтобы оправиться от ошибки «срезы границ вне диапазона»)

Беста,

+2

Этот учебник ужасен. Паника не является типичным способом обработки ошибок, и ни одно из них не печатает их на stdout и не выходит. Идентификация ошибок по их строке ошибки является наименее предпочтительным способом их идентификации. – Aedolon

ответ

1

Используйте утверждение типа, чтобы получить errorhttps://play.golang.org/p/BryV7YfZHS

defer func(){ 
    err := recover().(error) 
    fmt.Println(err.Error()) 
}() 

a := make([]int, 0) 
a[1] = 0 

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

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

+0

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

Смежные вопросы