20.2. 프로그램언어 고(Go)의 panic과 recover 활용

프로그램언어 고(Go)에서의 panic 함수 사용방법

고(Go)언어에서 panic 함수는 프로그램 실행 도중에 문제나 오류가 발생했을 때 사용하는 함수입니다. panic 함수를 호출하면 해당 함수를 호출한 곳에서 실행이 중단되고 연쇄적으로 호출 스택을 타고 올라가면서 defer로 등록된 함수들이 실행됩니다.


package main

import "fmt"

func badFunc() {
    panic("오류 발생!") 
}

func test() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err) 
        }
    }()

    badFunc()
    fmt.Println("이 문장은 실행되지 않음")
}

func main() {
    test()
    fmt.Println("정상 종료")
}

위 예제코드에서 badFunc 함수가 panic을 발생시킵니다. 이로 인해 test 함수 내에서 panic이 전파되면서 test 함수의 실행이 중단되고, defer로 등록된 익명 함수가 실행되어 panic을 recover 합니다.

recover 함수를 사용하여 panic을 다시 정상 실행 상태로 복구할 수 있습니다. 이를 통해 프로그램이 완전 종료되지 않고 정상 종료를 할 수 있습니다.

이처럼 고(Go)언어의 panic과 defer, recover를 조합하여 오류 발생 시에도 안정적으로 프로그램을 운용할 수 있습니다. 하지만 panic과 recover는 예외처리 기법이 아니라고 하니, 가급적 출력에 기록하고 직접 처리하라고 권장하고 있습니다.

더 자세한 내용은 고(Go)언어 문서나 서적을 참고하시기 바랍니다. 위 예제코드와 설명이 panic 함수 사용법에 대한 이해에 도움이 되었기를 바랍니다.

프로그램언어 고(Go)의 recover 함수 사용방법

Go 언어의 recover 함수는 패닉(panic)이 발생했을 때, 패닉을 복구하고 정상 실행 흐름으로 되돌리는 함수입니다.

recover 함수는 보통 defer 문과 함께 사용합니다. defer 문을 사용하면 함수가 반환하기 전에 defer 다음에 정의된 함수를 실행합니다.

다음은 recover 함수의 기본적인 사용 방법입니다.


func main() {

  defer func() {
    if r := recover(); r != nil {
      // 여기서 패닉 복구 처리
    }
  }()

  // 패닉이 발생할 수 있는 코드

}

main 함수 내에서 익명 함수를 defer 문으로 등록했습니다. 여기서 defer로 등록한 익명 함수 내부에서 recover 함수를 호출하고 있습니다.

recover 함수가 nil이 아닌 값을 반환한다면 패닉이 발생한 것이고, 이 때 패닉 복구 처리 코드를 실행할 수 있습니다. 만약 recover 함수가 nil을 반환한다면 패닉이 발생하지 않은 것입니다.

다음은 패닉이 발생하는 간단한 예제와 recover 함수 사용 예제입니다.


package main

import "fmt"

func badFunction() {
    // index out of range 패닉 발생
    slice := []int{1, 2, 3} 
    fmt.Println(slice[3])  
}

func test() {
    defer func() {
        // 패닉 복구
        if r := recover(); r != nil {
            fmt.Println("Panic recovered - ", r)
        }
    }()
    
    badFunction()
    fmt.Println("After badFunction") // 실행 X
}

func main() {
  test()
  fmt.Println("Normal exit")  
}

badFunction 함수에서 slice 인덱스 범위를 벗어나 패닉이 발생합니다. test 함수 내에서 badFunction을 defer 익명 함수로 감싸고 있습니다.

defer 익명 함수 내부의 recover 함수를 통해 패닉을 복구했기 때문에 “Panic recovered” 문장과 함께 정상 실행 흐름이 계속 됩니다. 즉, “After badFunction”과 “Normal exit” 문장이 출력됩니다.

recover 함수를 사용할 때는 다음의 사항에 주의하시기 바랍니다.

– 반드시 defer 함수 내부에서 사용해야 합니다.
– 현재 함수에서 패닉이 발생했을 때만 복구할 수 있습니다.
– 하위 함수의 패닉은 복구할 수 없습니다.
– 패닉 메시지는 인터페이스 타입으로 반환합니다.

이상으로 Go 언어의 recover 함수 사용 방법에 대해 간략히 설명드렸습니다. 예제와 함께 더 자세히 이해하실 수 있기를 바랍니다. 친절한 설명이 되었기를 바라며 더 궁금하신 사항이 있으시면 문의 주시면 감사하겠습니다.

프로그램언어 고(Go)에서의 panic과 recover 이해

Go 언어에서 panic과 recover는 오류 처리와 복구를 위한 중요한 기능입니다.

panic은 큰 문제가 발생했을 때 프로그램의 실행 흐름을 즉시 멈추고, defer 함수들을 실행시키기 위해 사용합니다. panic을 호출하면 실행 중이던 함수는 즉시 return 되고, 호출 스택의 가장 위로 올라가면서 defer 함수들을 순서대로 실행합니다.


func panicDemo() {
  fmt.Println("Start")
  panic("Something bad happened") 
  fmt.Println("End") // Never executes
}

func main() {
  defer func() {
    if err := recover(); err != nil {
      log.Println("Error:", err) 
    }
  }()
  
  panicDemo()
}

위 예제에서 panicDemo 함수가 panic을 호출하면 “End”가 출력되지 않고, main 함수의 defer 함수에서 복구하고 있습니다.

recover는 panic에서 복구하기 위해 사용합니다. 보통 defer 함수 안에서 실행하며, recover를 호출하면 panic 데이터를 반환합니다. 반환된 데이터로 로깅하거나 오류 처리를 할 수 있습니다.

defer와 함께 사용할 때 가장 효과적입니다. 함수가 panic 되더라도 defer가 보장되기 때문입니다. 위 예제처럼 main 함수내에서 defer, recover 로 panic에서 복구할 수 있습니다.

panic과 recover의 주요 용도는 크리티컬한 오류가 발생했을 때, 안전하게 프로그램 상태를 복구하고 정상 종료하기 위함입니다. 제대로 사용하면 시스템의 안정성을 높일 수 있습니다.

프로그램언어 고(Go)에서의 panic 상태 이해

프로그램언어 Go에서 panic은 실행 중에 발생한 오류 상황을 나타내는 데 사용됩니다. panic은 복구할 수 없는 심각한 오류가 발생했을 때 프로그램의 실행 흐름을 즉시 멈추고, defer로 등록된 함수들을 호출한 후 프로그램을 종료시킵니다.

package main

import "fmt"

func main() {
  fmt.Println("Start")

  panic("Error occurred") // panic 발생

  fmt.Println("End") // 이 코드는 실행되지 않음
}

위 예제코드에서 panic(“Error occurred”) 함수를 호출하여 panic을 발생시킵니다. 이 때 “Error occurred” 라는 메시지가 panic에 담겨 전달됩니다.

panic이 발생하면 main() 함수 내부에서 defer로 등록된 함수들이 먼저 호출됩니다. 그리고 나서 프로그램의 실행이 즉시 멈추고, “End” 문자열을 출력하는 fmt.Println() 함수는 실행되지 않습니다.

즉, panic은 복구할 수 없는 심각한 오류가 발생했음을 프로그래머에게 알리고, 정상적인 실행 흐름을 멈추어 버리는 기능을 합니다. 주로 라이브러리 개발시에 잘못된 API 사용이나 논리적 오류가 발생했을 때 panic을 사용하여 실행을 즉시 멈추고 오류를 전파합니다.

주의할 점은 panic이 nil 값을 가질 수 없고, 반드시 리커버리(recovery)되어야 한다는 것입니다. main() 함수에서 발생한 panic은 리커버리되지 않으면 프로그램이 죽게 됩니다. 반면에 Goroutine에서 발생한 panic은 호출한 함수내에서 리커버리가 이루어져야 정상적으로 처리할 수 있습니다.

이상으로 Go 언어의 panic과 error 처리 기법에 대한 간략한 설명을 드렸습니다. 더 자세한 사용법과 예제코드가 필요하시면 댓글로 문의주시기 바랍니다.

프로그램언어 고(Go)의 recover로 panic 회복하기

Go언어의 recover() 함수를 사용하면 panic 발생 시 회복이 가능합니다.

recover()는 defer 함수 내에서 사용하며, panic이 발생하면 그 panic을 중단시키고 제어흐름을 정상으로 돌려줍니다.

예를 들어 다음과 같은 코드에서 panic이 발생합니다.


package main

import "fmt"

func badFunction() {
    panic("Panic occured!") 
}

func test() {
    defer func() {
        fmt.Println("Deferred function")
    }()
    badFunction()
    fmt.Println("After badFunction()") 
}

func main() {
    test()
    fmt.Println("Normal exit")
}

여기서 badFunction() 실행시 “Panic occured!” 라는 메시지와 함께 panic이 발생합니다.

그래서 test() 함수 내의 나머지 문장인 fmt.Println(“After badFunction()”) 이 실행되지 않고, main() 함수의 fmt.Println(“Normal exit”)도 실행되지 않는 현상을 확인할 수 있습니다.

이러한 상황에서는 defer 함수 내부에 recover() 함수를 사용하여 제어흐름의 정상 복구를 시도할 수 있습니다.


package main

import "fmt"

func badFunction() {
    panic("Panic occured!")
}

func test() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Panic recovered") 
        }
    }()

    badFunction()
    fmt.Println("After badFunction()") 
}

func main() {
   test()
   fmt.Println("Normal exit")
}

위 코드에서 defer 함수 내부의 recover()가 panic 상황을 감지하고, 제어흐름을 정상적으로 복구합니다.

따라서 badFunction() 이후 문장인 fmt.Println(“After badFunction()”) 이 정상적으로 실행되고, main() 함수의 fmt.Println(“Normal exit”)도 실행됩니다.

즉, panic 발생시키는 함수를 사용하는 함수들은 defer/recover 조합을 사용하여 panic 상황에서도 복구가 가능합니다.

recover 함수는 defer 함수 내에서만 제대로 동작하므로 유의해야하고, 활용하는데 주의가 필요합니다.

panic 회복에 대한 Go 언어의 recover 사용 예시와 설명이 위와 같습니다. 더 궁금하신 점이 있으시면 문의 주시기 바랍니다.

Leave a Comment