더북(TheBook)

URL 쿼리로 전달된 dividenddivisor를 사용해서 나누기를 수행한 결과를 화면에 출력했다. 만약 divisor0을 전달하면 웹 서버에서 패닉이 발생한다. 하지만 다음과 같이 에러 핸들러를 사용하면 안전하게 나누기를 처리할 수 있다.

func errorHandler(fn http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err, ok := recover().(error); ok {
                http.Error(w, err.Error(), http.StatusInternalServerError)
            }
        }()
        fn(w, r)
    }
}
 
func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        errorHandler(handle)(w, r)
    })
    http.ListenAndServe(":8080", nil)
}

다음은 실행 결과이다.

명령 프롬프트

$ curl http://127.0.0.1:8080/divide?dividend=9\&divisor=0

runtime error: integer divide by zero

에러 핸들러 방식의 단점은 같은 함수 서명에만 에러 핸들러를 사용할 수 있다는 점이다. 함수 서명이 다르면 다른 에러 핸들러를 정의해야 한다. 하지만 에러 핸들러에서 처리하는 함수의 매개변수와 반환 타입을 빈 인터페이스의 슬라이스(...interface{})로 정의하면 모든 형태의 함수를 처리할 수 있다.

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