Как обработать panic и вернуть 500 http в go?

Пользователь

от jaren , в категории: Golang , 8 месяцев назад

Как обработать panic и вернуть 500 http в go?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от alisa.bahringer , 7 месяцев назад

@jaren 

В Go, при возникновении паники (panic), можно обработать ее с помощью механизма "recover". Этот механизм позволяет программисту перехватить панику и выполнить дополнительные действия перед завершением программы.


Чтобы вернуть HTTP-код 500 в случае паники, можно использовать конструкцию defer-recover. Код будет выглядеть примерно так:

1
2
3
4
5
6
7
8
func handler(w http.ResponseWriter, r *http.Request) {
    defer func() {
        if err := recover(); err != nil {
            http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
        }
    }()
    // код вашего обработчика здесь
}


Этот код перехватывает любые паники, которые могут возникнуть внутри обработчика, и возвращает HTTP-код 500 вместе с сообщением об ошибке. Вы можете настроить сообщение об ошибке на свое усмотрение.


Также, для удобства, можно создать отдельную функцию для обработки ошибок и использовать ее в своих обработчиках:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func handleError(w http.ResponseWriter, err error) {
    log.Println(err)
    http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}

func handler(w http.ResponseWriter, r *http.Request) {
    defer func() {
        if err := recover(); err != nil {
            handleError(w, fmt.Errorf("panic: %v", err))
        }
    }()
    // код вашего обработчика здесь
}


В этом примере мы создаем отдельную функцию handleError, которая логирует ошибку и возвращает HTTP-код 500. Обработчик handler использует эту функцию для обработки ошибок, которые могут возникнуть внутри него.