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 블록 안에서 실행시킬 수 있다.