Обработка ошибок

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 и предоставляет нам дополнительную контекстуальную информацию о файле и строке, в которой произошла ошибка.

results matching ""

    No results matching ""