Что выведет код Middle Ошибки, defer, panic и recover обновлено

Что выведет Go: recover превращает панику в ошибку

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import "fmt"

func safeDiv(a, b int) (res int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered: %v", r)
        }
    }()
    res = a / b
    return res, nil
}

func main() {
    fmt.Println(safeDiv(6, 3))
    fmt.Println(safeDiv(1, 0))
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 2 <nil>, 0 recovered: runtime error: integer divide by zero. Первый вызов проходит без паники.

Что выведет

2 <nil>
0 recovered: runtime error: integer divide by zero

Разбор

Первый вызов проходит без паники. Во втором деление на переменную, равную нулю, вызывает панику рантайма. Отложенная функция ловит её recover и записывает ошибку в именованный результат, а res остаётся нулевым. Функция возвращается нормально.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме