17 Функции
Чем panic отличается от error?
Ответ
error — ожидаемая неудача: файл не найден, сеть оборвалась, строка не разобралась. panic — сломан инвариант программы. Её ловят только в defer через recover, и почти всегда на границе процесса или запроса, а не в обычной библиотечной функции.
Подробнее
После recover функция, где стоял defer, продолжается как обычно, а функции выше по стеку уже размотаны. Библиотека, которая превращает любую ошибку в панику, заставляет каждого вызывающего помнить про recover. Возвращай error.
package main
import "fmt"
func safe() {
defer func() {
if v := recover(); v != nil {
fmt.Println("поймали:", v)
}
}()
panic("учебный сбой")
}
func main() {
safe()
fmt.Println("программа продолжилась")
}