Есть приложение с несколькими эндпоинтами, кучей зависимостей (БД, кэш, библиотеки). Где нужно прописать recover, чтобы в случае паники приложение не упало?

Если функция P() из сторонней библиотеки с вероятностью вызывает панику, а код библиотеки открыт, можно предпринять следующие шаги:

Короткий ответ

Что ответить на собеседовании

Если функция P() из сторонней библиотеки с вероятностью вызывает панику, а код библиотеки открыт, можно предпринять следующие шаги:

Подробный разбор

Ответ с пояснениями

Если функция P() из сторонней библиотеки с вероятностью вызывает панику, а код библиотеки открыт, можно предпринять следующие шаги:

  1. Обернуть вызов функции P() в конструкцию recover для перехвата паники и предотвращения падения всего сервиса.
  2. Изучить код функции P() в vendor, чтобы понять причины паники — возможно, это ошибка в логике или неправильное использование.
  3. Если возможно, исправить ошибку в библиотеке и собрать её заново.
  4. Если исправление невозможно или требует времени, можно написать обёртку вокруг P(), которая будет безопасно вызывать функцию и обрабатывать ошибки.

Пример обёртки с recover на Go:

func safeP() (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("panic caught: %v", r)
        }
    }()
    P() // вызов проблемной функции
    return nil
}

Таким образом, сервис не будет падать из-за паники, а можно будет логировать и анализировать ошибки.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее