URL 쿼리로 전달된 dividend과 divisor를 사용해서 나누기를 수행한 결과를 화면에 출력했다. 만약 divisor에 0을 전달하면 웹 서버에서 패닉이 발생한다. 하지만 다음과 같이 에러 핸들러를 사용하면 안전하게 나누기를 처리할 수 있다.
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) }
다음은 실행 결과이다.
에러 핸들러 방식의 단점은 같은 함수 서명에만 에러 핸들러를 사용할 수 있다는 점이다. 함수 서명이 다르면 다른 에러 핸들러를 정의해야 한다. 하지만 에러 핸들러에서 처리하는 함수의 매개변수와 반환 타입을 빈 인터페이스의 슬라이스(...interface{})로 정의하면 모든 형태의 함수를 처리할 수 있다.