Making a Web Application Robust

This lesson shows how to make an application robust by making it able to withstand a minor panic.

We'll cover the following

When a handler function in a web application panics our web server simply terminates. This is not good: a web server must be a robust application, able to withstand what perhaps is a temporary problem. A first idea could be to use defer/recover in every handler-function, but this would lead to much duplication of code. Applying the error-handling scheme with closures is a much more elegant solution. Here, we show this mechanism applied to the simple web-server made previously, but it can just as easily be applied in any web-server program.

To make the code more readable, we create a function type for a page handler-function:

type HandleFnc func(http.ResponseWriter,*http.Request)

Our errorHandler function applied here becomes the function logPanics:

func logPanics(function HandleFnc) HandleFnc {
  return func(writer http.ResponseWriter, request *http.Request) {
    defer func() {
      if x := recover(); x != nil {
        log.Printf("[%v] caught panic: %v", request.RemoteAddr, x)
      }
    }()
  function(writer, request)
 }
}

And we wrap our calls to the handler functions within logPanics:

http.HandleFunc("/test1", logPanics(SimpleServer))
http.HandleFunc("/test2", logPanics(FormServer))

The handler-functions should contain panic calls or a kind of check(error) function.

Example

The complete code is listed here:

Get hands-on with 1200+ tech skills courses.