뽀미의 개발노트

Go는 exception이 없다 본문

Go lang

Go는 exception이 없다

산타는 뽀미 2024. 12. 20. 23:20

Go panic

 

 


 

 

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

 

  1. 프로그램 시작” 출력됨.
  2. defer는 일단 건너뛰고 dangerousOperation 함수로 들어감. defer 건너뜀.
  3. 위험한 작업 시작” 출력됨.
  4. n > 5 만족해서 panic 발생 → 해당 함수 내의 defer 훑음 → “dangerousOperation 종료” 출력됨.
  5. main 함수로 돌아가서 defer 훑음 (LIFO라서 거꾸로 실행)
  6. defer2” 출력됨.
  7. recover()가 panic을 잡고 “패닉 복구: 패닉이 발생했습니다!” 출력됨. (panic이 안 일어났으면 nil이라 아무 동작 안함)
  8. 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