개발일기

Go - panic() / recover() 예외처리 본문

프로그래밍 언어/Go

Go - panic() / recover() 예외처리

Flashback 2022. 8. 9. 21:17
728x90
반응형

 

Go에서는 Java, PHP의 try / catch와 비슷하게 에러를 처리해주는 panic() / recover()가 존재한다.

  • panic() : 에러를 직접 발생시킬 때 사용한다.
  • recover() : 에러 또는 panic()으로 인한 에러가 발생했을때, 예외처리를 해준다.

1. panic()을 사용한 에러 발생

package main
import "fmt"

func panicStart() {
  panic("Error Start!")
}

func main() {
  panicStart()
  fmt.Println("panicStart Func End")
}

/*
    실행 결과 : 
    panic: Error Start!
*/

panic()의 괄호 안에 에러 문구를 추가하면 된다.

panic()을 통해 에러가 발생한 경우, 프로그램이 바로 종료가 된다. 위에 결과에서 볼 수 있듯이 panicStart함수가 종료되고 나서 "panicStart Func End"라는 텍스트가 출력되지 않는 것을 확인할 수 있다. 즉, panic()으로 인해 프로그램을 종료가 되고 하위 부분은 실행이 되지 않는다는 것을 확인할 수 있다.

 

2. recover()로 에러 처리

package main
import "fmt"

func panicStart() {

  defer func() { // 익명함수로 예외처리하는 함수 생성
    resRecover := recover()
    fmt.Println(resRecover) // panic()에러 문구를 recover()로 받아 출력한다.
  }()
  
  panic("Error Start!")
}

func main() {
  panicStart()
  fmt.Println("panicStart Func End")
}

/*
    실행 결과 : 
    Error Start!
    panicStart Func End
*/

panic()으로 발생시킨 에러, 또는 프로그램 로직의 문제로 인해 발생한 에러를 recover()를 통해 예외처리 해준다. recover()를 사용하면 프로그램은 종료가 되지 않는다. 또한 recover()를 사용할 때, 꼭 defer 키워드를 사용하여 지연 호출할 수 있도록 해줘야 한다. defer를 사용하지 않을 경우, recover()가 실행되지 않고 프로그램이 바로 종료되버린다.

 

 

defer 호출이란? --

https://phsun102.tistory.com/107

 

Go - defer 호출이란?

1. defer란? defer란 특정한 함수를 실행할 때, 해당 부분을 함수가 종료되기 직전에 실행시키는 기능을 뜻한다. 2. defer 정의법 defer test() // test는 함수명 defer test(a int, b int) // 매개변수로 추가할..

phsun102.tistory.com

 

 

3. 프로그램 에러를 recover()

package main
import "fmt"

func fruitFunc() {

  defer func() {
    resRecover := recover()
    fmt.Println(resRecover)
  }()
  
  fruitList := []string{ "melon", "grape" }
  // melon의 index : 0
  // grape의 index : 1
  fmt.Println(fruitList[2]) // 없는 인덱스값을 출력시킬 경우
}

func main() {
  fmt.Println("fruitFunc Start")
  fruitFunc()
  fmt.Println("fruitFunc End Success")
}

/*
    실행 결과 : 
    fruitFunc Start
    runtime error: index out of range [2] with length 2
    fruitFunc End Success
*/

과일 목록을 담고 있는 슬라이스 변수 fruitList에서 인덱스 범위를 벗어나는 값을 출력시키는 함수를 생성해 보았다. 위의 코드는 프로그램 에러가 100% 발생하는 코드이기에 recover를 사용하여 예외처리를 해주었다.

실행 결과에서 확인할 수 있듯이, 'index out of range'라는 에러가 발생하였다. 하지만 recover()를 통해 예외처리를 해주었기에 프로그램이 바로 종료되지 않고 하위 출력 코드를 실행시키고 종료되게 된다.

 


참고 사이트 : 

https://progressivecoder.com/the-one-stop-guide-to-golang-panic-and-recover-mechanism/#1-what-are-panics-in-golang

 

The One Stop Guide to Golang Panic and Recover Mechanism

Learn how to use Golang Panic and Recover mechanism to handle panic in program execution by means of defer and recover() function

progressivecoder.com

 

https://www.educative.io/answers/what-is-panic-in-golang

 

What is panic() in Golang?

Contributor: Samia Ishaque

www.educative.io

 

728x90
반응형

'프로그래밍 언어 > Go' 카테고리의 다른 글

Go - 구조체 선언 및 사용법  (0) 2022.08.27
Go - 포인터란 무엇인가  (0) 2022.08.14
Go - defer 호출이란?  (0) 2022.08.07
Go - 함수의 정의 및 사용법  (0) 2022.08.03
Go - Map이란?  (0) 2022.03.29
Comments