더북(TheBook)

에러 상황이 심각해서 프로그램을 더 이상 실행할 수 없을 때는 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()을 수행한다.

물론 패닉이 발생했을 때 프로그램을 종료하지 않고 계속해서 이어갈 수도 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.