Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplifying repetitive error handling with julienschmidt httprouter

Tags:

go

Golang.org has a blogpost about how to do this: http://blog.golang.org/error-handling-and-go

They basically make a new type

type appHandler func(http.ResponseWriter, *http.Request) error

Which implements the http.Handler interface like so

func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if err := fn(w, r); err != nil {
        http.Error(w, err.Error(), 500)
    }
}

And with this you are able to return errors on your handleFunc which is great.

But I am using the julienschmidt httprouter and that uses a function rather than an interface that implements http.Handler. I like to use this router because it supports named parameters.

How can I wrap "something" around the httprouter.Handler function so that I can return errors and return other stuff aswel?

Is there a way to do this to prevent repetitive error handling? I could not find a way.

like image 384
Aiden Avatar asked Sep 09 '15 16:09

Aiden


1 Answers

Use closures:

type Handle func(http.ResponseWriter, *http.Request, Params)

type ErrHandle func(http.ResponseWriter, *http.Request, Params) error

func (eh ErrHandle) ToHandle() Handle {
    return func(w http.ResponseWriter, r *http.Request, p Params) {
        if err := eh(w, r, p); err != nil {
            http.Error(w, err.Error(), 500)
        }
    }
}
like image 135
Ainar-G Avatar answered Sep 20 '22 02:09

Ainar-G