더북(TheBook)

에러 처리 미들웨어 작성

핸들러 내에서 패닉이 발생했을 때 웹 서버를 종료하지 않고 500 에러를 출력하는 recoverHandler를 작성해 보자.

▼ middleware.go

func recoverHandler(next HandlerFunc) HandlerFunc {
    return func(c *Context) {
        defer func() {
            if err := recover(); err != nil {
                log.Printf("panic: %+v", err)
                http.Error(c.ResponseWriter,
                    http.StatusText(http.StatusInternalServerError),
                    http.StatusInternalServerError)
            }
        }()
        next(c)
    }
}

핸들러를 등록할 때 logHandlerrecoverHandler를 체인 형태로 묶어서 등록해 보자.

▼ main.go

r.HandleFunc("GET", "/users/:id", logHandler(recoverHandler(func(c *Context) {
    if c.Params["id"] == "0" {
        panic("id is zero")
    }
    fmt.Fprintf(c.ResponseWriter, "retrieve user %v\n", c.Params["id"])
})))

이제 웹 서버를 구동하고 웹 요청을 전송하여 logHandlerrecoverHandler가 잘 동작하는지 확인해 보자.

curl로 GET 요청을 전송한다.

명령 프롬프트

$ curl http://localhost:8080/users/1

retrieve user 1

 

$ curl http://localhost:8080/users/0

Internal Server Error

웹 서버 로그를 확인한다.

명령 프롬프트

$ ./app

2015/09/27 00:19:59 [GET] "/users/1" 35.953?s

2015/09/27 00:20:01 panic: id is zero

2015/09/27 00:20:01 [GET] "/users/0" 66.149?s

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.