// 패닉-리커버 함수
package main
import "fmt"
func f (){
defer func(){
s:=recover() // panic이 발생하면 recover()가 호출됨
fmt.Println(s) // panic이 발생한 위치를 알 수 있음
}() // 즉시 실행 함수 꼴
panic("panic occurred") // panic 발생
}
func main() {
f()
fmt.Println("after panic") // panic이 발생해도 이 부분은 실행됨
}
Q1.
여기에서, recover()만 하면 되는거 아니야? 왜 굳이 변수에 할당시키고 읽히게 하는거지?
A1.
아주 좋은 질문이야! 👏
recover()만 호출해도 panic은 "복구"되는데, 왜 굳이 s := recover() 처럼 값을 변수에 담아 출력하는지 궁금한 거지?
✅ recover()의 동작 요점
- recover()는 panic을 복구하는 함수야.
- 하지만 그 자체로는 아무 출력도 하지 않아.
- 단순히 panic 상태를 "복구만" 하고, 프로그램 흐름을 정상으로 돌려줄 뿐이야.
📌 왜 변수에 할당하는가?
s := recover()
fmt.Println(s)
이 코드는 단순히:
- recover()를 호출해서 panic을 복구하고,
- 그 복구된 panic의 메시지 (보통 문자열)를 s라는 변수에 저장한 다음,
- 그걸 fmt.Println()으로 출력하는 거야.
즉, panic이 왜 났는지 확인하려고 메시지를 출력하는 거지!
🤔 만약 이렇게만 하면?
defer func() {
recover()
}()
- panic은 복구돼서 프로그램은 죽지 않지만,
- 왜 panic이 났는지 알 수 없음.
- 에러 로그도 출력되지 않아서 디버깅이 힘들어져.
✅ 요약하자면
코드설명
코드 | 설명 |
recover()만 호출 | panic은 복구되지만 원인 메시지를 못 봄 |
s := recover(); fmt.Println(s) | panic 메시지를 확인하고 로그로 남길 수 있음 |
🔧 그래서 보통은 이렇게 써
defer func() {
if err := recover(); err != nil {
fmt.Println("panic 발생:", err)
}
}()
- 에러가 있을 때만 출력하도록 if로 감싸기도 해.
- 실무에선 로그 찍거나, 사용자 메시지 출력, 리소스 정리 등도 여기서 같이 해!
원한다면 로그 남기기나 JSON 포맷 출력 등 실전 스타일로도 바꿔줄 수 있어 😎
더 궁금한 점 있어?
'언어 및 도구들 공부 > Go' 카테고리의 다른 글
Go) Channel, select (0) | 2025.04.06 |
---|---|
Go) 포인터 자동 역참조 (0) | 2025.04.06 |
Go) go.mod, go.sum (0) | 2025.04.04 |
빈 식별자, blank identifier, _ (0) | 2025.04.04 |
Go) Unmarshal과 포인터 (0) | 2025.04.04 |