0Pricing
Go Academy · Урок

Интерфейс error

Идиоматичный возврат и проверка ошибок

«Интерфейс error» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Философия обработки ошибок в Go

Go обрабатывает ошибки как значения, а не исключения. Функции возвращают error в качестве последнего возвращаемого значения. Вызывающий код должен явно проверить его:

package main
import ("fmt"; "strconv")

func main() {
    n, err := strconv.Atoi("abc")
    if err != nil {
        fmt.Println("error:", err)  // handle it
        return
    }
    fmt.Println(n)
}

Интерфейс ошибок

Встроенный error — это простой интерфейс:

// Built into Go — no import needed
type error interface {
    Error() string
}

// Any type with Error() string satisfies it
// nil means no error

Возврат ошибок

Функции, которые могут завершиться ошибкой, возвращают (value, error). При отсутствии ошибки возвращайте nil:

package main
import ("fmt"; "errors")

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

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

Идиома if err != nil

Проверка if err != nil — самая распространённая идиома Go. Всегда обрабатывайте ошибки — не игнорируйте их:

package main
import ("fmt"; "os")

func main() {
    f, err := os.Open("config.json")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer f.Close()
    // use f...
    _ = f
}

errors.New — простые значения ошибок

errors.New создаёт простую ошибку с фиксированным сообщением:

package main
import ("fmt"; "errors")

var ErrNotFound = errors.New("not found")

func findByID(id int) (string, error) {
    data := map[int]string{1: "Alice"}
    v, ok := data[id]
    if !ok {
        return "", ErrNotFound
    }
    return v, nil
}

func main() {
    _, err := findByID(99)
    fmt.Println(err) // not found
}

fmt.Errorf — форматированные сообщения об ошибках

fmt.Errorf создаёт ошибки с контекстом из форматированных строк:

package main
import "fmt"

func openConfig(path string) error {
    // Add context to the error message
    return fmt.Errorf("openConfig %s: file not found", path)
}

func main() {
    err := openConfig("/etc/app/config.yaml")
    fmt.Println(err)
    // openConfig /etc/app/config.yaml: file not found
}

Ошибки-маркеры

Ошибки-маркеры — это значения ошибок уровня пакета, используемые для сравнения идентичности:

package main
import ("fmt"; "errors")

var (
    ErrTimeout    = errors.New("timeout")
    ErrPermission = errors.New("permission denied")
)

func doRequest() error { return ErrTimeout }

func main() {
    err := doRequest()
    if errors.Is(err, ErrTimeout) {
        fmt.Println("request timed out — retrying")
    }
}

Игнорирование ошибок — это ошибка

Go требует использовать каждую объявленную переменную, но игнорирование ошибок с помощью _ успешно компилируется и является распространённой ошибкой, которой следует избегать:

package main
import "os"

func bad() {
    os.Remove("temp.txt") // silently ignores error — bad practice
}

func good() error {
    if err := os.Remove("temp.txt"); err != nil {
        return err  // propagate
    }
    return nil
}

Контекст ошибки: добавление сведений

При передаче ошибок вверх по стеку вызовов добавляйте контекст, описывающий неудачную операцию:

package main
import "fmt"

func readConfig(path string) ([]byte, error) {
    return nil, fmt.Errorf("readConfig: %w", fmt.Errorf("file %s not found", path))
}

func setup() error {
    _, err := readConfig("/etc/app.cfg")
    if err != nil {
        return fmt.Errorf("setup: %w", err) // wrap with context
    }
    return nil
}

func main() {
    err := setup()
    fmt.Println(err) // setup: readConfig: file /etc/app.cfg not found
}

Несколько возвращаемых ошибок

Функции могут возвращать ошибки из нескольких точек отказа. Проверяйте каждую из них:

package main
import ("fmt"; "strconv")

func parseRange(minStr, maxStr string) (int, int, error) {
    min, err := strconv.Atoi(minStr)
    if err != nil { return 0, 0, fmt.Errorf("min: %w", err) }
    max, err := strconv.Atoi(maxStr)
    if err != nil { return 0, 0, fmt.Errorf("max: %w", err) }
    if min > max { return 0, 0, fmt.Errorf("min %d > max %d", min, max) }
    return min, max, nil
}

func main() {
    lo, hi, err := parseRange("1", "10")
    if err != nil { fmt.Println(err); return }
    fmt.Println(lo, hi)
}

Быстрая проверка

Что означает возвращаемое значение nil для ошибки в Go?

Повторение: интерфейс ошибок

Основные понятия обработки ошибок:

  • Ошибка — встроенный интерфейс: Error() string
  • Возвращайте (value, error) — значение nil означает успех
  • errors.New используется для простых ошибок, а fmt.Errorf — для форматированных ошибок
  • Всегда проверяйте if err != nil
  • Добавляйте контекст при передаче ошибок вверх по стеку
  • Никогда не игнорируйте ошибки молча

Часто задаваемые вопросы

Урок «Интерфейс error» бесплатный?

Да — полный текст урока «Интерфейс error» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Интерфейс error»?

Идиоматичный возврат и проверка ошибок Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Интерфейс error»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Интерфейс error
  2. Создание пользовательских ошибок
  3. Обёртывание и распаковка ошибок
  4. panic, recover и defer
← Назад к Go Academy