Sobes.tech
Back to questions
Senior
4

Сервис на проде стабильно не живёт больше 5 минут. Удалось локализовать проблему — есть некая функция P() в сторонней библиотеке, которая с какой-то вероятностью паникует. Как решить эту проблему? Библиотека открытая, код можно смотреть в vendor.

Companies where asked
Базис

Answer from AI

sobes.tech AI

Если функция 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
}

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