일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- go 환경변수
- go channel
- go middleware
- gin logger
- go panic
- go디자인패턴
- go 마스코트
- gin recovery
- go 대기그룹
- 신입개발자
- go air
- go 맥 air 환경변수
- air 환경변수
- 좀비고루틴
- clean architecture middleware
- 개발자
- 고루틴 채널
- gopath 환경변수
- golang gopher
- go 패닉
- go
- gin middleware
- go clean architecture
- go 맥
- 골랑 고퍼
- go 맥 air
- go air 환경변수
- go 캐릭터
- go recover
- git
Archives
- Today
- Total
뽀미의 개발노트
Go는 exception이 없다 본문

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” 출력됨.
'Go lang' 카테고리의 다른 글
Go 프레임워크 + 테스트코드 라이브러리 (0) | 2024.12.20 |
---|---|
Go 고루틴과 채널 (1) | 2024.12.20 |
Go 컴파일 언어 (0) | 2024.12.20 |
Go 포인터와 GC (0) | 2024.12.20 |
Go 구조체와 인터페이스 (1) | 2024.12.20 |