Fiber는 기본적으로 panics을 처리하지 않습니다. 스택의 핸들러에 의해 발생한 panic에서 복구하려면 아래의 Recover 미들웨어를 포함해야 합니다:
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("This panic is caught by fiber")
})
log.Fatal(app.Listen(":3000"))
}
fiber.NewError()를 사용하여 추가 status code를 전달하기 위해 Fiber의 사용자 정의 오류 struct를 사용할 수 있습니다. 메시지를 전달하는 것은 선택 사항입니다. 메시지를 비워두면 상태 코드 메시지(404는 Not Found와 같음)로 기본 설정됩니다.
app.Get("/", func(c *fiber.Ctx) error {
// 503 Service Unavailable
return fiber.ErrServiceUnavailable
// 503 On vacation!
return fiber.NewError(fiber.StatusServiceUnavailable, "On vacation!")
})
기본 오류 핸들러
Fiber는 기본적으로 오류 핸들러를 제공합니다. 표준 오류의 경우 응답은 500 Internal Server Error로 전송됩니다. 오류가 fiber.Error 유형인 경우 제공된 상태 코드와 메시지로 응답이 전송됩니다.
// 기본 오류 핸들러
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// 상태 코드는 기본적으로 500
code := fiber.StatusInternalServerError
// *fiber.Error인 경우 사용자 정의 상태 코드 검색
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Content-Type: text/plain; charset=utf-8 설정
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// 오류 메시지와 함께 상태 코드 반환
return c.Status(code).SendString(err.Error())
}
사용자 정의 오류 핸들러
Fiber instance를 초기화할 때 Config를 사용하여 사용자 정의 오류 핸들러를 설정할 수 있습니다.
대부분의 경우 기본 오류 핸들러로 충분합니다. 그러나 사용자 정의 오류 핸들러는 다양한 유형의 오류를 캡처하고 그에 따라 조치를 취하려는 경우에 유용할 수 있습니다. 예를 들어, 알림 이메일을 보내거나 중앙 집중식 시스템에 오류를 기록할 수 있습니다. 또한 오류 페이지나 JSON 응답과 같은 사용자 정의된 응답을 클라이언트에 보낼 수 있습니다.
다음 예제는 다양한 유형의 오류에 대해 오류 페이지를 표시하는 방법을 보여줍니다.
// 사용자 정의 설정으로 새로운 fiber 인스턴스 생성
app := fiber.New(fiber.Config{
// 기본 오류 핸들러 재정의
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// 상태 코드는 기본적으로 500
code := fiber.StatusInternalServerError
// *fiber.Error인 경우 사용자 정의 상태 코드 검색
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// 사용자 정의 오류 페이지 전송
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// SendFile이 실패한 경우
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
// 핸들러에서 반환
return nil
},
})
// ...
오류 처리에 대한 아이디어를 주신 Echo 및 Express 프레임워크에 특별히 감사드립니다.