Sobes.tech
Back to questions
Middle
2

Как в Go принято обрабатывать ошибки? Что такое паника и как её обработать?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В Go ошибки принято обрабатывать явно, возвращая значение ошибки из функции и проверяя его в месте вызова. Это позволяет контролировать поток выполнения и принимать решения при возникновении ошибок.

Пример обработки ошибки:

func readFile(filename string) ([]byte, error) {
    data, err := os.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return data, nil
}

func main() {
    data, err := readFile("file.txt")
    if err != nil {
        fmt.Println("Ошибка чтения файла:", err)
        return
    }
    fmt.Println(string(data))
}

Паника (panic) — это механизм, который используется для обработки критических ошибок, когда программа не может продолжать нормальное выполнение. При вызове panic выполнение функции прерывается, начинается «раскрутка» стека вызовов (stack unwinding), вызываются отложенные функции (defer), и если паника не будет обработана, программа завершится с ошибкой.

Обработать панику можно с помощью функции recover(), которую обычно вызывают в отложенной функции:

func safeFunction() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Восстановились после паники:", r)
        }
    }()
    panic("что-то пошло не так")
}

Таким образом, в Go ошибки обрабатываются через возвращаемые значения, а паника используется для критических ситуаций, которые можно попытаться восстановить с помощью recover.