PHpullh
학습 라이브러리/Go/패닉과 복구

GO · 에러처리

패닉과 복구

panic은 치명적 에러, recover는 패닉을 잡아 정상 흐름으로 복귀합니다.

에러처리중급panicrecoverdefererror-handling

핵심 설명

panic은 치명적 에러, recover는 패닉을 잡아 정상 흐름으로 복귀합니다.

Go code

package main

import "fmt"

// recover는 반드시 defer에서 호출
func safeDiv(a, b int) (result int, err error) {
	defer func() {
		if r := recover(); r != nil {
			err = fmt.Errorf("패닉 복구: %v", r)
		}
	}()

	return a / b, nil // b==0이면 패닉
}

// 미들웨어에서 패닉 복구
func withRecover(fn func()) {
	defer func() {
		if r := recover(); r != nil {
			fmt.Printf("복구됨: %v\n", r)
		}
	}()
	fn()
}

func main() {
	result, err := safeDiv(10, 0)
	if err != nil {
		fmt.Println(err) // 패닉 복구: runtime error: integer divide by zero
	} else {
		fmt.Println(result)
	}

	withRecover(func() {
		panic("의도적 패닉!")
	})

	fmt.Println("프로그램 계속 실행")
}

학습 팁

HTTP 서버의 미들웨어에서 recover를 사용하면 하나의 요청 패닉이 전체 서버를 중단시키지 않습니다.

주의할 점

panic은 정상적인 에러 처리에 사용하면 안 됩니다. 프로그래머 에러(불가능한 상태)에만 사용하세요.

자주 묻는 질문

패닉과 복구란 무엇인가요?

panic 은 치명적 에러, recover 는 패닉을 잡아 정상 흐름으로 복귀합니다.

패닉과 복구 학습 시 주의할 점은 무엇인가요?

panic 은 정상적인 에러 처리에 사용하면 안 됩니다. 프로그래머 에러(불가능한 상태)에만 사용하세요.