Featured image of post Golang: 10. 에러

Golang: 10. 에러

Go는 내장 타입으로 error 라는 인터페이스 타입을 갖는다. Go 에러는 이 error 인터페이스를 통해서 주고 받게 되는데, 메서드 하나를 갖는다.

1
2
3
type error interface {
    Error() string
}

개발자는 error 인터페이스를 구현하는 커스텀 에러 타입을 만들 수 있다.

Go 에러처리

Go 함수가 결과와 에러를 함께 반환한다면, 이 에러가 nil 인지 체크하여 에러를 확인할 수 있다.

예를들어 os.Open() 함수는 func Open(name string) (file *File, err error) 과 같은 함수 원형을 갖는데, File 포인터와 error 인터페이스를 함께 반환한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main
 
import (
    "log"
    "os"
)
 
func main() {
    f, err := os.Open("C:\\temp\\1.txt")
    if err != nil {
        log.Fatal(err.Error())
    }
    println(f.Name())
}

그래서 반환된 두번째 error을 체크하여 nil 이면 에러가 없는 것이고, 아니라면 err.Error()로 부터 해당 에러를 알 수 있다.

  • log.Fatal()은 메시지를 출력하고 os.Exit(1)을 호출하여 프로그램을 종료한다.

error Type을 이용한 에러처리

또 다른 에러처리로 error의 Type을 체크하여 에러 타입별로 별도의 에러 처리를 하는 방식이 있다.

1
2
3
4
5
6
7
8
9
_, err := otherFunc()
switch err.(type) {
default: // no error
    println("ok")
case MyError:
    log.Print("Log my error")
case error:
    log.Fatal(err.Error())
}

예제에서 otherFunc()를 호출한 후 반환된 error의 타입을 통해 여러 유형의 에러를 처리할 수 있다.

  • 모든 에러는 error 인터페이스를 구현하므로 마지막 case문은 모든 에러에 적용된다.