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 |
댓글