본문 바로가기
Language/Golang

Golang panic(패닉)과 recover(복구): Java에서의 try-catch 구문

by 돈코츠라멘 2019. 9. 10.

panic

프로그램 실행 중에 에러가 발생(= 런타임 에러)하여 종료되는 상황을 패닉이라고 표현한다. Java에서의 Exception과 유사한 상황이다. 배열의 범위를 넘어서는 인덱스로 접근하는 상황이 대표적인 예시이다.
패닉이 발생하면 현재 함수를 즉시 멈추고 defer 함수들을 모두 실행한 후 즉시 리턴한다.

func main() {
    fmt.Println(divide(1, 0))
}

func divide(a, b int) int {
    return a / b
}
panic: runtime error: integer divide by zero

런타임 에러뿐만 아니라 panic 함수를 사용해서 직접 에러를 발생시킬 수도 있다.

panic(Error_Message)

func main() {
    panic("Error in main")
}
panic: Error in main

recover

recover 함수를 사용하면 패닉이 발생했을 때 예외 처리를 할 수 있다. Java에서의 try-catch 구문과 비슷하게 동작한다.

변수 := recover()

  • recover 함수는 반드시 지연 호출 함수로 사용해야 한다는 점을 기억하자. 그렇지 않으면 프로그램이 바로 종료되어 recover 함수가 실행되지 않는다.
  • recover 함수를 사용하면 패닉이 발생하더라도 프로그램을 종료하지 않고 나머지를 계속 실행한다.

recover를 사용하지 않았을 때

func main() {
    fmt.Println("before")
    fmt.Println(divide(1, 0)) // panic !!!
    fmt.Println("after") // 실행 X
}

func divide(a, b int) int {
    return a / b
}
before
panic: runtime error: integer divide by zero

recover를 사용 했을 때

func main() {
    fmt.Println("before")
    fmt.Println(divide(1, 0))
    fmt.Println("after")
}

func divide(a, b int) int {
    defer func() {
        msg := recover() // recover 함수로 패닉 복구
        fmt.Println(msg)
    }()
    return a / b
}
before
runtime error: integer divide by zero
0
after

'Language > Golang' 카테고리의 다른 글

Golang defer (지연 호출)  (0) 2019.09.07
Golang Closure  (0) 2019.09.06
Golang first-class function (일급함수)  (0) 2019.09.03
Golang 함수  (0) 2019.09.03

댓글