Post

Go 에러 처리(with defer)

Go 에러 처리(with defer)

Panic

Go에서 에러가 발생하고 종료되는 상황을 panic이라고 한다.(ex.arr overrange 같은 상황 발생 시)

Go에서는 개발자가 임의로 이러한 상황을 발생시킬 수 있다.

1
2
3
4
fucn main(){
    panic("Oh My God")
}
//panic: Oh My God

패닉 발생 시 다른 코드는 실행되지 않고 종료된다. 이러한 상황은 recover()함수로 해결할 수 있다.

1
2
3
4
5
6
7
8
9
func expOccur(){
    defer func(){
        e := recover()

        fmt.Println(e)
    }()

    panic("wow!")
}

이렇게 한다면 expOccur() 이후에도 다른 코드들이 실행된다. 여기서 defer가 필요하다.

defer(지연함수)

말 그대로 지연된 함수다. 함수내에 위치할 때 다른 코드들이 모두 실행되고 해당함수가 종료되기 전에 호출된다. 기본적으로 (LIFO) 구조이다. 그래서 defer를 여러 개 선언하면 마지막 함수가 먼저 호출된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func HiDe(){
    defer func(){
        fmt.Println("1")
    }()//나중에 호출됨

    defer func(){
        fmt.Println("2")
    }()//먼저 호출됨


}   // 2
    // 1

func ByeDe(){
    defer fmt.Println("Bye")
    return  //Bye출력
}

위 코드의 HiDe()가 종료될 때 defer들이 호출된다. return으로 값을 반환하고 종료될 때도 마찬가지

Try Catch In Go

개발자가 임의로 panic을 끌어내는게 아니라 overrange처럼 의도하지 않고 panic이 발생할 수 있다. 길이가 2로 선언된 배열을 for문으로 10까지 탐색해본다고 가정하자. 그러면 무조건 panic이 발생할 것이다. 그럼 그냥 실행중인 프로그램이 종료되고 데이터들을 잃을 수도 있다. 다른 언어에서는 try catch로 예외 상황을 잡으니 Go에서는 defer로 recover을 불러와 이러한 상황을 무마한다.

1
2
3
4
5
6
7
8
9
10
11
func catchErr(){
    defer func(){
        e := recover();
        fmt.Println(e)
    }
    arr := [...]int{1,2}

    for i := 0;i<10;i++{
        fmt.Println(arr[i])
    }
}

위 코드에서는 출력이 1과2가 나오고 panic문구는 빠지고 runtime에러만 출력이 될 것이다. 이후 다른 코드가 있다면 다른 상황이 발생하지 않는 이상 모두 실행되고 프로그램은 종료될 것이다.

This post is licensed under CC BY 4.0 by the author.