언어 및 도구들 공부/Go

Go) recover()

Dr.Mlem 2025. 4. 6. 09:00
// 패닉-리커버 함수
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)

이 코드는 단순히:

  1. recover()를 호출해서 panic을 복구하고,
  2. 그 복구된 panic의 메시지 (보통 문자열)를 s라는 변수에 저장한 다음,
  3. 그걸 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