Go lang
Go는 exception이 없다
산타는 뽀미
2024. 12. 20. 23:20

panic, defer, recover
go에는 try-catch문이 없다. 대신 panic을 처리하기 위해 defer/recover 를 사용한다.
1. defer
- 함수 리턴하기 직전에 실행
- LIFO (Last In, First Out) → 호출된 순서와 반대로 실행됨.
- C#의 finally 처럼 사용됨 (이미 리턴, 예외, panic 등이 일어나도 항상 후처리)
2. panic
- 현재 함수 멈추고 defer 모두 실행.
- 상위함수로 전파됨.
- 마지막 → 프로그램 종료
3. recover
- panic 잡고 그 값을 가져옴. 프로그램 복구해서 이어지게 함.
- defer 함수 내에서만 쓸 수 있음.
- panic이 안 일어나면 recover()가 nil 임.
예시
package main
import "fmt"
func main() {
fmt.Println("프로그램 시작")
defer fmt.Println("defer 1")
// panic과 recover 사용
defer func() {
if r := recover(); r != nil {
fmt.Println("패닉 복구:", r)
}
}()
defer fmt.Println("defer 2")
// 일반적인 함수 호출
dangerousOperation(10)
fmt.Println("이 줄은 실행되지 않습니다") // panic 때문에 실행되지 않음
}
func dangerousOperation(n int) {
defer fmt.Println("dangerousOperation 종료")
fmt.Println("위험한 작업 시작")
if n > 5 {
panic("패닉이 발생했습니다!")
}
fmt.Println("작업 완료") // panic 때문에 실행되지 않음
}
// 출력 내용
프로그램 시작
위험한 작업 시작
dangerousOperation 종료
defer 2
패닉 복구: 패닉이 발생했습니다!
defer 1
- “프로그램 시작” 출력됨.
- defer는 일단 건너뛰고 dangerousOperation 함수로 들어감. defer 건너뜀.
- “위험한 작업 시작” 출력됨.
- n > 5 만족해서 panic 발생 → 해당 함수 내의 defer 훑음 → “dangerousOperation 종료” 출력됨.
- main 함수로 돌아가서 defer 훑음 (LIFO라서 거꾸로 실행)
- “defer2” 출력됨.
- recover()가 panic을 잡고 “패닉 복구: 패닉이 발생했습니다!” 출력됨. (panic이 안 일어났으면 nil이라 아무 동작 안함)
- “defer1” 출력됨.