Все вопросы

17 Функции

Чем panic отличается от error?

error — ожидаемая неудача: файл не найден, сеть оборвалась, строка не разобралась. panic — сломан инвариант программы. Её ловят только в defer через recover, и почти всегда на границе процесса или запроса, а не в обычной библиотечной функции.

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

Пример

Go

recover живёт внутри defer

package main

import "fmt"

func safe() {
    defer func() {
        if v := recover(); v != nil {
            fmt.Println("поймали:", v)
        }
    }()
    panic("учебный сбой")
}

func main() {
    safe()
    fmt.Println("программа продолжилась")
}