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 중국어 웹사이트의 기타 관련 기사를 참조하세요!