Обработка ошибок
Go не имеет Exception модели обработки, как большинство языков основного потока. Однако он использует тип интерфейса ошибки в качестве возвращаемого типа для любой ошибки, которая будет возвращена из функции или метода:
type error interface {
Error() string
}
Это тип интерфейса. Переменная ошибки представляет любое значение, которое может описывать себя как строку. Наиболее часто используемая реализация ошибок находится в пакете ошибок .
Его можно устранить следующим образом:
func DivideBy(divider float64) (float64, error) {
if divider <= 0 {
return 0, errors.New("Divider cannot be zero or negative number.")
}
// implementation
}
Эти errors.Newфункции строят экспортированной тип , errorStringкоторый реализует Errorинтерфейс:
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package errors implements functions to manipulate errors.
package errors
// New returns an error that formats as the given text.
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
Это довольно сложно реализовать собственный тип ошибки, который содержит дополнительные данные.
Модель ошибки Golangне предоставляет способ выяснить, какая функция вернула ошибку. Мы должны знать и регистрировать ошибки очень тщательно, чтобы понять, где произошла эта ошибка.
К счастью, Golangсреда выполнения предоставляет набор функций, которые мы можем использовать для создания stacktrace, который мы можем легко отслеживать.
В следующих параграфах мы рассмотрим пакет Planatir stacktrace , который сделает это для нас.
Начиная
Пакет фиксирует стратегические места по стеку вызовов и связывает соответствующую контекстуальную информацию, такую как сообщения и переменные. Он сохраняет компактность стека и максимально полезен.
Монтаж
Чтобы использовать пакет, мы должны сначала его установить, используя известную go getкоманду:
$ go get github.com/palantir/stacktrace
Применение
Пакет предоставляет различные функции для распространения и генерации этой контекстной информации.
Распространение ошибок
stacktrace.Propagateфункция заменяет использование fmt.Errorfфункции. Он включает ошибку, включающую информацию о номере линии. Это будет ваш самый распространенный вызов stacktrace.
db, err := sql.Open("postgres", conninfo)
if err != nil {
return stacktrace.Propagate(err, "Failed to connect %v", conninfo)
}
Создание ошибок
stacktrace.NewError создает новую ошибку, включающую информацию о номере линии:
if amount <= 0 {
return stacktrace.NewError("Expected amount %v to be positive number", arg)
}
Коды ошибок
Иногда полезно размножать код ошибки при разматывании стека. Например, API RESTful может использовать код ошибки для установки кода состояния HTTP. Тип stacktrace.ErrorCodeиспользуется для обозначения набора кодов ошибок, относящихся к вашему приложению:
const (
ConnectionTimeout = stacktrace.ErrorCode(iota)
ConnectionLost
)
Значение stacktrace.NoCode равно math.MaxUint16, поэтому не используйте это. NoCodeэто значение по умолчанию для ошибок, в которых явно не установлен код ошибки.
Вы можете использовать stacktrace.PropagateWithCodeи stacktrace.NewErrorWithCodeинициировать ошибку с определенным кодом:
db, err := sql.Open("postgres", conninfo)
if err != nil {
return stacktrace.PropagateWithCode(err, ConnectionTimeout, "Failed to connect %v", conninfo)
}
Вы можете извлечь код ошибки из ошибки, используя stacktrace.GetCode функцию:
data, err := fetch()
if err != nil {
code := stacktrace.GetCode(err)
if code == ConnectionTimeout {
return nil
}
}
Выводы
stacktrace Пакет очень приятный и легкий в использовании. Он соответствует идиоматическому способу обработки ошибок Golang и предоставляет нам дополнительную контекстуальную информацию о файле и строке, в которой произошла ошибка.