더북(TheBook)

6.4.2 클로저로 에러 처리

함수가 항상 defer-panic-recover 블록 안에서 실행되도록 클로저를 만들어 반환하는 에러 핸들러 함수를 만들어 보자.

type fType func(int, int) int
 
func errorHandler(fn fType) fType {
    return func(a int, b int) int {
        defer func() {
            if err, ok := recover().(error); ok {
                log.Printf("run time panic: %v", err)
             
            }
        }()
        return fn(a, b)
    }
}

errorHandler() 함수에서는 에러가 발생하면 recover()로 에러를 복원하여 그것을 로그로 출력한다.

func(int, int) int와 서명이 같은 함수를 errorHandler() 함수로 실행하면 패닉으로 프로그램이 종료되는 것을 막을 수 있다.


func main() {
    fmt.Println(errorHandler(divide)(4, 2))
    fmt.Println(errorHandler(divide)(3, 0))
}
 
func divide(a int, b int) int {
    return a / b
}

실행 결과

2

2009/11/10 23:00:00 run time panic: runtime error: integer divide by zero

0

이처럼 특정 함수 서명에 에러 핸들러 함수를 정의해 놓으면, 서명이 같은 함수는 모두 defer-panic-recover 블록 안에서 실행시킬 수 있다.

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