@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 использует эту функцию для обработки ошибок, которые могут возникнуть внутри него.