>백엔드 개발 >Golang >Gin 미들웨어가 반복적인 `if` 문 없이 모든 HTTP 오류를 처리할 수 있습니까?

Gin 미들웨어가 반복적인 `if` 문 없이 모든 HTTP 오류를 처리할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-05 03:52:02394검색

Can Gin Middleware Handle All HTTP Errors Without Repetitive `if` Statements?

Gin 미들웨어의 오류 관리

질문

Gin에서는 반복적인 if 문을 작성하지 않고도 각 경로의 모든 HTTP 오류를 처리할 수 있습니까? 400, 404, 500 등의 오류가 발생합니까? 목표는 전용 미들웨어 기능 내에서 오류를 캡처하고 처리하는 것입니다.

답변

예, 미들웨어를 사용하면 오류 처리를 중앙 집중화할 수 있으므로 경로 핸들러에서 반복적인 if 문이 필요하지 않습니다. 방법은 다음과 같습니다.

미들웨어 구현

ErrorHandler라는 미들웨어 함수를 만듭니다.

<code class="go">func ErrorHandler(c *gin.Context) {
    // Execute remaining handlers
    c.Next()

    // Retrieve and handle errors
    for _, err := range c.Errors {
        // Log, handle, etc.
    }

    // Default handler if no other error is handled
    c.JSON(http.StatusInternalServerError, "")
}</code>

미들웨어 사용

기본 함수에 ErrorHandler 미들웨어를 등록합니다.

<code class="go">// ...
router := gin.New()
router.Use(middleware.ErrorHandler)
// ...</code>

라우트 핸들러 수정

라우트 핸들러에서 외부 오류 핸들러를 호출하는 대신 오류가 있는 요청을 중단하기만 하면 됩니다.

<code class="go">func (h *Handler) List(c *gin.Context) {
    movies, err := h.service.ListService()

    if err != nil {
        // Abort the request with the error
        c.AbortWithError(http.StatusInternalServerError, err)
        return
    }

    c.JSON(http.StatusOK, movies)
}</code>

미들웨어의 오류 처리

ErrorHandler 미들웨어에서 컨텍스트에서 캡처된 오류를 검사합니다.

<code class="go">for _, ginErr := range c.Errors {
    switch ginErr.Err {
        case ErrNotFound:
            c.JSON(-1, gin.H{"error": ErrNotFound.Error()})
        // ...
    }
}</code>

로깅 및 사용자 정의

또한 다음과 같이 로깅을 통합하거나 미들웨어에 사용자 정의 인수를 전달할 수도 있습니다. 필요:

<code class="go">func ErrorHandler(logger *zap.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()
        
        for _, ginErr := range c.Errors {
            logger.Error("whoops", ...)
        }
    }
}</code>

또한 c.JSON을 호출할 때 상태 코드로 -1을 사용하여 오류 처리기에서 명시적으로 설정된 HTTP 상태를 덮어쓰지 않는 것이 좋습니다.

다중 오류

경로 핸들러에서 c.Error를 사용하여 여러 오류를 캡처하고 오류 미들웨어에서 종합적으로 처리할 수 있습니다.

마무리

오류 처리를 위해 미들웨어를 사용하면 코드베이스가 간소화되고 오류 처리 프로세스를 사용자 정의 및 확장할 수 있으며 오류 관리를 위한 중앙 집중식 제어 지점을 제공합니다.

위 내용은 Gin 미들웨어가 반복적인 `if` 문 없이 모든 HTTP 오류를 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.