Строковые ошибки
Стандартная библиотека предлагает два готовых варианта.
// простая строковая ошибка
err1 := errors.New("math: square root of negative number")
// с форматированием
err2 := fmt.Errorf("math: square root of negative number %g", x)
Пользовательские ошибки с данными
Чтобы определить пользовательский тип ошибки, вы должны реализовать предварительно объявленный интерфейс error.
type error interface {
Error() string
}
Вот два примера.
type SyntaxError struct {
Line int
Col int
}
func (e *SyntaxError) Error() string {
return fmt.Sprintf("%d:%d: syntax error", e.Line, e.Col)
}
type InternalError struct {
Path string
}
func (e *InternalError) Error() string {
return fmt.Sprintf("parse %v: internal error", e.Path)
}
Если Foo является функцией, которая может возвращать SyntaxError или InternalError, вы можете обрабатывать два случая, как показано ниже:
if err := Foo(); err != nil {
switch e := err.(type) {
case *SyntaxError:
// Делаем что-нибудь интересное с e.Line и e.Col.
case *InternalError:
// Прервать и записать проблему.
default:
log.Println(e)
}
}
Читайте также:
Комментариев нет:
Отправить комментарий