수색…


비고

이 기사는 Defer Basics에 대한 지식이 있다고 가정합니다.

일반적인 에러 핸들링에 대해서는 에러 핸들링에 관한 주제를 읽으십시오.

공포

패닉은 정상적인 실행 흐름을 중단하고 현재 기능을 종료합니다. 제어가 스택의 다음 상위 함수로 전달되기 전에 연기 된 호출이 실행됩니다. 각 스택의 함수는 지연된 recover() 사용하여 패닉이 처리되거나 패닉이 main() 도달하여 프로그램을 종료 recover() 때까지 지연된 호출을 종료하고 실행합니다. 이 경우 패닉에 제공된 인수와 스택 추적이 stderr 인쇄됩니다.

package main

import "fmt"

func foo() {
    defer fmt.Println("Exiting foo")
    panic("bar")
}

func main() {
    defer fmt.Println("Exiting main")
    foo()
}

산출:

Exiting foo
Exiting main
panic: bar


goroutine 1 [running]:
panic(0x128360, 0x1040a130)
    /usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
    /tmp/sandbox550159908/main.go:7 +0x160
main.main()
    /tmp/sandbox550159908/main.go:12 +0x120

panic 이 매개 변수로 모든 유형을 허용한다는 점에 유의해야합니다.

다시 덮다

이름에서 알 수 있듯이 복구는 panic 에서 회복을 시도 할 수 있습니다. 일반 실행 흐름이 중지되면 지연 명령문에서 복구 시도 해야합니다 . recover 문은 지연된 기능 격납 장치 내에 직접 나타나야합니다. 지연 함수 호출로 호출 된 함수의 복구 명령문은 무시됩니다. 프로그램이 현재 패닉 상태 인 경우 recover() 호출은 초기 패닉에 제공된 인수를 리턴합니다. 프로그램이 현재 당황하지 않으면 recover()nil 을 반환합니다.

package main

import "fmt"

func foo() {
    panic("bar")
}

func bar() {
    defer func() {
        if msg := recover(); msg != nil {
            fmt.Printf("Recovered with message %s\n", msg)
        }
    }()
    foo()
    fmt.Println("Never gets executed")
}

func main() {
    fmt.Println("Entering main")
    bar()
    fmt.Println("Exiting main the normal way")
}

산출:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow