«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как вернуть ошибку, если функция Go паникует?

Как вернуть ошибку, если функция Go паникует?

Опубликовано 18 ноября 2024 г.
Просматривать:369

How to Return an Error if a Go Function Panics?

Возврат из Defer в Go

Вы столкнулись с проблемой, из-за которой вы хотите вернуть ошибку, если функция в Go вызывает панику. Вот анализ и исправление вашего кода:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = errors.New("Unknown panic")
            }
            rep = nil // Invalidate rep
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function...
}

Концепция паники и отсрочки

  • Паника: Паника сигнализирует об ошибке времени выполнения, которую можно обнаружить при восстановлении в функция defer.
  • Defer: Оператор defer задерживает выполнение функции до тех пор, пока не завершится работа окружающей функции.

Изменения в коде:

  • Функция defer теперь использует операторы переключения регистра для правильной обработки восстановленного значения.
  • Если восстановленное значение является строкой, оно преобразуется в ошибку с использованием ошибок.Новое ().
  • Переменная Rep становится недействительной после возникновения ошибки, чтобы гарантировать, что она не возвращает никаких данных.
  • Переменная Rep возвращается как ноль в случае ошибки, что соответствует вашему оригинальная сигнатура функции.

Благодаря этим изменениям ваша функция getReport будет возвращать ошибку, если произойдет паника из-за недопустимого формата отчета. Сообщение об ошибке будет либо значением паники (если это строка), либо общей ошибкой, указывающей на неизвестную панику.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3