🐛Error Handling


Fiber는 오류를 핸들러에 반환하여 중앙 집중식 오류 처리를 지원합니다. 이를 통해 외부 서비스에 오류를 기록하거나 클라이언트에 사용자 정의 HTTP 응답을 보낼 수 있습니다.

오류 캐치

경로 핸들러와 미들웨어를 실행하는 동안 발생하는 모든 오류를 Fiber가 캐치하도록 하는 것이 중요합니다. 오류를 핸들러 함수에 반환해야 합니다. 그러면 Fiber가 오류를 캐치하고 처리합니다.

app.Get("/", func(c *fiber.Ctx) error {
    // Fiber에 오류 전달
    return c.SendFile("file-does-not-exist")
})

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를 사용할 수 있습니다. 메시지를 전달하는 것은 선택 사항입니다. 메시지를 비워두면 상태 코드 메시지(404Not 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
    },
})

// ...

오류 처리에 대한 아이디어를 주신 EchoExpress 프레임워크에 특별히 감사드립니다.

Last updated