Интерфейс 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 — локальная установка не требуется.
Все уроки этого курса
- Интерфейс error
- Создание пользовательских ошибок
- Обёртывание и распаковка ошибок
- panic, recover и defer