Error
- 라이브러리 루틴들은 호출자에게 어떤 조짐의 에러라 해도 자주 리턴해 주어야 함
- 이전에 언급되었듯이, Go의 다중값 리턴은 일반적인 리턴값에 비해 상세한 에러 내용을 제공하기 쉽게 만들어줌
- 상세한 에러 내용을 제공하기 위해 이러한 특징을 활용하는 것은 좋은 방식
- 규약에 의하면 에러는 간단한 내장 인터페이스의 에러 타입을 가진다
type error interface {
Error() string
}
- 라이브러리 개발자는 보이지는 않지만 좀 더 풍부한 모델을 사용해 위의 인터페이스를 자유롭게 구현하면서, 에러를 보여줄 뿐만 아니라 어떤 맥락을 함께 제공하는 것도 가능함
- 예를 들어, 보통
os.Open는 *os.File 값을 리턴하는 동시에 에러값도 리턴함
- 만약 파일이 성공적으로 오픈되면, 에러는
nil이 될 것이고
- 오픈 도중 문제가 발생할경우
os.PathError의 값을 가지게 될 것
// PathError는 에러와 연산, 문제를 발생시킨 파일 경로를 가지고 있다.
type PathError struct {
Op string // "open", "unlink", 등.
Path string // 관련 파일.
Err error // 시스템 콜에 의해 리턴됨.
}
func (e *PathError) Error() string {
return e.Op + " " + e.Path + ": " + e.Err.Error()
}
PathError의 Error메서드는 다음과 같은 문자열을 생성함
open /etc/passwx: no such file or directory
- 위의 에러는 문제가 발생한 파일명과 연산, 그리고 문제를 발생시킨 운영체제 에러를 가지고 있으며, 이는 문제를 발생시킨 시스템 콜로부터 멀리 떨어진 곳에서 보여준다해도 유용함
- 이는 단순히
no such file or directory를 보여주는것보다 훨씬 많은 정보를 제공함.
- 가능한 경우, 에러 문자열은 에러가 발생된 명령이나 패키지를 접두어로 쓰는등, 에러의 근원지를 파악할 수 있어야 함
- 정확한 상세 에러내용에 관심이 있는 호출자는 자세한 그리고 추가적인 정보를 얻기 위해 타입 스위칭이나 타입 단언을 사용할 수 있음