에러 상황이 심각해서 프로그램을 더 이상 실행할 수 없을 때는 panic() 함수를 사용해 강제로 패닉을 발생시키고 프로그램을 종료할 수 있다. panic() 함수는 프로그램을 종료시킬 때 화면에 출력할 값을 매개변수로 받는다. 주로 error 값을 panic() 함수의 매개변수로 전달한다.
package main import "fmt" func main() { fmt.Println("Starting the program") panic("A severe error occurred: stopping the program!") fmt.Println("Ending the program") }
실행 결과
Starting the program
panic: A severe error occurred: stopping the program!
goroutine 1 [running]:
main.main()
/tmp/sandbox911063577/main.go:7 +0x180
goroutine 2 [runnable]:
runtime.forcegchelper()
/usr/src/go/src/runtime/proc.go:90
runtime.goexit()
/usr/src/go/src/runtime/asm_amd64p32.s:1086 +0x1
goroutine 3 [runnable]:
runtime.bgsweep()
/usr/src/go/src/runtime/mgc0.go:82
runtime.goexit()
/usr/src/go/src/runtime/asm_amd64p32.s:1086 +0x1
goroutine 4 [runnable]:
runtime.runfinq()
/usr/src/go/src/runtime/malloc.go:712
runtime.goexit()
/usr/src/go/src/runtime/asm_amd64p32.s:1086 +0x1
Starting the program을 출력한 후 이어서 panic() 함수를 호출했으므로 panic: A severe error occurred: stopping the program! 메시지와 함께 패닉이 발생했다. Ending the program은 출력되지 않고 프로그램이 종료된다.
에러가 발생했을 때 프로그램을 종료하려면 다음과 같이 에러를 확인해서 panic()을 호출하면 된다.
if err != nil { panic("ERROR occurred:" + err.Error()) }
함수 안에서 panic()이 호출되면 현재 함수의 실행을 즉시 종료하고 모든 defer 구문을 실행한 후 자신을 호출한 함수로 패닉에 대한 제어권을 넘긴다. 이러한 작업은 함수 호출 스택의 상위 레벨로 올라가며 계속 이어지고, 프로그램 스택의 최상단(main 함수)에서 프로그램을 종료하고 에러 상황을 출력한다. 이 작업을 패니킹(panicking)이라 한다
Note 기본 라이브러리에서 패닉을 발생시키는 함수와 메서드
기본 라이브러리에는 Must로 시작하는 함수가 많다(예를 들면 regexp.MustCompile, template.Must 등). 이 함수에서는 에러가 발생하면 panic()을 수행한다.
물론 패닉이 발생했을 때 프로그램을 종료하지 않고 계속해서 이어갈 수도 있다.