에러를 처리하는 가장 기본 방식은 에러를 반환하고 알맞게 처리하는 방식이다.
error 는 사실 인터페이스로 문자열을 반환하는 Error() 메서드로 구성되어 있다. 즉 어떤 타입이든 문자열을 반환하는 Error() 메서드를 포함하고 있다면 에러로 사용할 수 있다는 것이다.
때로는 에러를 감싸서 새로운 에러를 만들어야 할 수도 있다. 발생한 에어를 감싸고 그 바깥 줄과 칸 정보를 넣으면 된다.
fmt.Errorf 메서드에 에러 정보와 함께 새로운 스트링 구문으로 출력하기도 한다.
감싸진 에어를 다시 꺼내올 떄는 어떻게 해야 할까? errors 패키지의 As() 함수를 이용하면 된다. errors.As() 는 err 안에 감싸진 에러 중 두 번째 인수의 타입인 *strconv.NumError 로 변환될 수 있는 에러가 있다면 변환하여 값을 넣고 true를 반환하는 함수 이다. 단순히 에러 객체 타입인지만 확인하는 Is() 함수도 제공하고 있다.
패닉은 프로그램을 정상 진행시키기 어려운 상황을 만났을 때 프로그램 흐름을 중지 시키는 기능이다. 내장 함수 panci() 으로 패닉 기능을 제공한다. error 인터페이스 를 사용하면 호출자에게 에러가 발생한 이유를 알려줄 수 있다. 그런데 프로그램을 수행하다 보면 예기치 못한 에러에 직면하기도 한다.
버그가 발생해 잘못된 메모리나, 메모리 부족등 실행불가하게 만드는 에러들이다. 이럴때 프로그램을 강제종료해서 문제를 빠르게 파악하는 편이 나을 수도 있다. 그럴때 패닉을 써서 빠르게 종료시킨다.
내장 함수 리버커는 발생한 패닉 객체를 반환해준다. recover() 는 빈 인터페이스를 반환한다. 그래서 반환 타입을 실제 사용하려면 타입 검사를 해야만 한다.
if r, ok := recover().(net.Error); ok {
fmt.Println("r is net.Error Type")
}