Проверка ошибок

В Go ошибки представлены встроенным интерфейсом error. Этот интерфейс содержит единственный метод Error() string, который возвращает текстовое описание ошибки. Проверка ошибок в Go выполняется путем сравнения возвращаемого значения ошибки с nil. Если функция возвращает ошибку, не равную nil, значит, произошла ошибка, и ее нужно обработать. В отличие от исключений в других языках, Go требует явной проверки каждой ошибки, что делает код более надежным и предсказуемым.

Синтаксис

goif err := doSomething(); err != nil {
  // handle error
  return err
}

Пример

Давайте рассмотрим базовый пример проверки ошибки при открытии файла:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  file, err := os.Open("nonexistent.txt")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()
  fmt.Println("File opened successfully")
}

Результат выполнения кода (если файл не существует):

go"open nonexistent.txt: no such file or directory"

Пример

Проверим ошибку при преобразовании строки в число с помощью strconv.Atoi:

gopackage main

import (
  "fmt"
  "strconv"
)

func main() {
  num, err := strconv.Atoi("abc")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println("Number:", num)
}

Результат выполнения кода:

go"Error: strconv.Atoi: parsing \"abc\": invalid syntax"

Пример

Рассмотрим пример обработки ошибки в функции, которая возвращает несколько значений:

gopackage main

import (
  "errors"
  "fmt"
)

func divide(a, b float64) (float64, error) {
  if b == 0 {
    return 0, errors.New("division by zero")
  }
  return a / b, nil
}

func main() {
  res, err := divide(10, 0)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println("Result:", res)
}

Результат выполнения кода:

go"Error: division by zero"

Смотрите также

  • тип error,
    который представляет собой интерфейс для работы с ошибками
  • функцию errors.New,
    которая создает новую ошибку с заданным текстом
  • функцию errors.Is,
    которая проверяет, является ли ошибка определенным типом
  • функцию errors.As,
    которая извлекает ошибку определенного типа из цепочки