에러

에러 (Errors)

Go에서는 오류가 생겼을 때 이걸 어떻게 표현할까요? 별도로 예외(exception)를 던지는 대신, error라는 타입을 반환값으로 돌려주는 걸 기본으로 써요. 이 섹션에서 그 타입이 정확히 어떻게 생겼는지, 어떻게 쓰는지 함께 볼게요.

출처: Go Specification

본문

미리 선언된 타입 error는 이렇게 정의돼 있어요.

type error interface {
	Error() string
}

error는 오류 상태를 나타낼 때 쓰는 관례적인 인터페이스인데요, 이때 nil 값은 오류가 없다는 뜻으로 써요. 즉 함수가 정상적으로 끝났을 때는 err 자리에 nil을 돌려주고, 문제가 생겼을 때만 error 값을 채워주는 거죠.

예를 들어 파일에서 데이터를 읽는 함수는 이렇게 선언할 수 있어요.

func Read(f *File, b []byte) (n int, err error)

읽어온 바이트 수는 n으로, 그리고 문제가 있었다면 그 내용이 err에 담겨 돌아와요. 호출하는 쪽에서는 이 errnil인지 아닌지 확인해서 다음 동작을 정하면 됩니다.

더 알아보기

  • error는 인터페이스로 정의되어 있어서, Error() string 메서드만 구현하면 어떤 타입이든 error로 쓸 수 있어요. 직접 만든 구조체에 이 메서드를 붙여 나만의 오류 타입을 만들 수 있죠.
  • 프로그램이 실행 중에 복구할 수 없는 오류에 부딪히면 panic이 발생하는데, 이는 이 섹션과 별개로 Run-time panics에서 다뤄져요.