Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Code Habit

Go ) 패닉과 복구 본문

카테고리 없음

Go ) 패닉과 복구

코드베어 2020. 6. 1. 09:23

프로그램이 잘못되어 에러가 발생한 뒤 종료되는 상황을 패닉이라고 한다. 

a := [...]int{1, 2}

for i := 0; i < 3; i++ {    // i는 0, 1, 2 까지 증가
	fmt.Println(a[i])       // 배열의 인덱스는 0, 1까지만 있으므로
}                           // 배열을 벗어난 접근을 하게 됨

// 실행 결과
1
2
panic: runtime error : index out of range

 

잘못된 부분으로 인해 발생하는 Go 언어 런타임 에러뿐만 아니라 panic 함수를 사용하면 사용자가 직접 에러를 발생시킬 수도 있다.

  • panic(에러 메시지)
func main() {
    panic("Error !!")
    fmt.Println("Hello, world!") // 실행되지 않음
}

// 실행 결과
panic: Error !!

 

recover 함수를 사용하면 패닉이 발생했을 때 프로그램이 바로 종료되지 않고 예외 처리를 할 수 있으며 다른 언어의 try catch 구문과 비슷하게 동작한다.

  • 변수 := recover()
func f() {
    defer func() {    // recover 함수는 지연 호출로 사용해야 함
        s := recover() // 패닉이 발생해도 프로그램을 종료하지 않음
                      // panic 함수에서 설정한 에러 메시지를 받아옴
        fmt.Println(s)
    }()
    
    panic("Error !!!")	// panic 함수로 에러 메시지 설정, 패닉 발생
}

func main() {
    f()
    
    fmt.Println("Hello world!") // 패닉이 발생했지만 계속 실행됨
}

// 실행 결과
Error !!!
Hello world!

 

panic 함수 사용이 아닌 실제 런타임 에러 상황에서도 recover 함수를 사용하면 프로그램이 종료되지 않고 계속 실행한다.

func f() {
    defer func() {
        s := recover()	// recover 함수로 런타임 에러(패닉) 상황을 복구
        fmt.Println(s)
    }()
    
    a := [...]int{1, 2}
    
    for i := 0; i < 5; i++ { // 배열 크기를 벗어난 접근
    	fmt.Println(a[i])
    }
}

func main() {
    f()
    
    fmt.Println("Hello, world!") // 런타임 에러가 발생했지만 recover 함수로
    							 // 복구되었기 때문에 정상적으로 실행됨
}

// 실행 결과
1
2
runtime error : index out of range
Hello, world!