Heim > Backend-Entwicklung > Golang > Kann Gin Middleware alle HTTP-Fehler ohne sich wiederholende „if'-Anweisungen verarbeiten?

Kann Gin Middleware alle HTTP-Fehler ohne sich wiederholende „if'-Anweisungen verarbeiten?

Barbara Streisand
Freigeben: 2024-11-05 03:52:02
Original
401 Leute haben es durchsucht

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

Verwalten von Fehlern in der Gin-Middleware

Frage

Ist es in Gin möglich, alle HTTP-Fehler auf jeder Route zu behandeln, ohne sich wiederholende if-Anweisungen dafür zu schreiben? 400, 404, 500 usw. Fehler? Das Ziel besteht darin, Fehler innerhalb einer dedizierten Middleware-Funktion zu erfassen und zu behandeln.

Antwort

Ja, Sie können eine Middleware verwenden, um die Fehlerbehandlung zu zentralisieren, wodurch die Notwendigkeit sich wiederholender if-Anweisungen in Routenhandlern entfällt. So geht's:

Middleware-Implementierung

Erstellen Sie eine Middleware-Funktion namens 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>
Nach dem Login kopieren

Middleware-Verwendung

Registrieren Sie die ErrorHandler-Middleware in der Hauptfunktion:

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

Modifikation des Routenhandlers

Brechen Sie in Routenhandlern einfach die Anfrage mit dem Fehler ab, anstatt einen externen Fehlerhandler aufzurufen:

<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>
Nach dem Login kopieren

Fehlerbehandlung in Middleware

Inspizieren Sie in der ErrorHandler-Middleware die im Kontext erfassten Fehler:

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

Protokollierung und Anpassungen

Sie können auch Protokollierung integrieren oder benutzerdefinierte Argumente an die Middleware übergeben als erforderlich:

<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>
Nach dem Login kopieren

Darüber hinaus sollten Sie erwägen, einen explizit festgelegten HTTP-Status in Ihrem Fehlerhandler nicht zu überschreiben, indem Sie beim Aufruf von c.JSON -1 als Statuscode verwenden.

Mehrere Fehler

Sie können c.Error in Routenhandlern verwenden, um mehrere Fehler zu erfassen und sie gemeinsam in der Fehler-Middleware zu behandeln.

Zusammenfassung

Die Verwendung einer Middleware für die Fehlerbehandlung optimiert Ihre Codebasis und ermöglicht Sie können den Fehlerbehandlungsprozess anpassen und erweitern und bietet einen zentralen Kontrollpunkt für das Fehlermanagement.

Das obige ist der detaillierte Inhalt vonKann Gin Middleware alle HTTP-Fehler ohne sich wiederholende „if'-Anweisungen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage