• SEARCH

    통합검색
  • GAMEZONE
    • 커뮤니티
      • 공지사항
      • 유저게시판
        • 등업게시판
        • 출석체크
        • 정회원 무료자료실
      • 스크린샷
      • 인증자료실
    • 리니지
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 메이플스토리
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 바람의나라
      • 자유게시판
      • 홍보게시판
      • 자료게시판
        • 유틸자료실
        • 소스자료실
        • 클라이언트
        • 팩 자료실
      • 연구게시판
        • 개발내역
        • 질문과답변
        • 기타
      • 강의게시판
        • DR
        • CR
        • 구버전
        • 클라이언트 개조
        • 노하우 게시판
        • 게임공략 & 팁
    • 다크에덴
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 믹스마스터
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 라그나로크
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 기타게임
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 게임강의
    • 비베&포토샵
      • 자유게시판
      • 자료실
        • 일반자료실
        • 포인트 자료실
      • 노하우게시판
      • 포토샵게시판
    • 모바일
      • 게임공략
      • 포인트 자료실
      • 유틸자료실
      • 자유게시판
  • 기타게임 소스자료실
    • 기타게임 소스자료실 기타 ()
    • [Go 공식문서 한국어 정리] ③ Go의 예외 처리: defer, panic, recover

      • 오뉴노노
      • 2026.05.30 - 00:26 1

    [Go 공식문서 한국어 정리] ③ Go의 예외 처리: defer, panic, recover

    원문 제목: Defer, Panic, and Recover
    작성자: Andrew Gerrand

    Go는 if, for, switch, goto 같은 일반적인 제어 흐름 문법을 제공합니다.
    여기서는 흔하지는 않지만 매우 강력한 세 가지 메커니즘인 defer, panic, recover에 대해 다룹니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📌 1. defer 문 — "나중에 실행"을 약속하는 문법
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    defer는 함수 호출을 목록에 저장해 두고, 현재 함수가 리털될 때 실행시킵니다.
    주로 파일 닫기, 뮤텍스 해제, 로그 푸터 출력 같은 정리(clean-up) 작업에 씁니다.

    예를 들어 두 파일을 열어 내용을 복사하는 함수를 보겠습니다.
    원래 코드는 중간에 에러가 나면 열어둔 파일을 닫지 못하는 버그가 있습니다.

    defer를 도입하면 파일을 열자마자 닫기를 예약할 수 있어,
    함수 내 return 문이 몇 개든 상관없이 파일은 반드시 닫힙니다.

    func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
    return
    }
    defer src.Close() // ← 여기서 닫기 예약

    dst, err := os.Create(dstName)
    if err != nil {
    return
    }
    defer dst.Close() // ← 여기서도 닫기 예약

    return io.Copy(dst, src)
    }

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📌 2. defer의 세 가지 간단한 규칙
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    ① defer 호출의 인자는 defer 문이 평가될 때 즉시 계산됩니다.
    예: defer fmt.Println(i) 에서 i는 defer 시점의 값이 고정됩니다.

    ② deferred 호출은 Last In First Out(LIFO) 순서로 실행됩니다.
    가장 마지막에 예약한 함수가 가장 먼저 실행됩니다.
    예: for문 안에서 0,1,2,3을 defer하면 출력은 3,2,1,0 입니다.

    ③ deferred 함수는 현재 함수의 named return 값을 읽고 수정할 수 있습니다.
    예: return 1 을 했는데 deferred func에서 i++ 하면 최종 반환값은 2가 됩니다.
    이 특성은 에러 반환값을 마지막에 수정할 때 유용합니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📌 3. panic — 보통의 흐름을 멈추는 비상 신호
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    panic은 내장 함수로, 정상적인 제어 흐름을 멈추고 패닉 상태를 시작합니다.
    함수 F가 panic을 호출하면 F의 실행이 즉시 중단됩니다.
    단, F 안의 deferred 함수들은 정상적으로 실행된 뒤,
    F는 호출자에게 panic 상태를 전파합니다.

    이 과정은 콜 스택을 따라 계속 올라가고,
    현재 고루틴의 모든 함수가 리털될 때까지 계속됩니다.
    그래도 recover가 없으면 프로그램은 크래시(종료)합니다.

    panic은 직접 호출할 수도 있고,
    배열 범위 초과 접근 같은 런타임 에러에 의해 자동 발생할 수도 있습니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📌 4. recover — 패닉 상태에서 되살아나는 구조
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    recover는 내장 함수로, 패닉 중인 고루틴의 제어권을 되찾습니다.
    중요한 점: recover는 반드시 deferred 함수 안에서만 의미가 있습니다.

    정상 실행 중에 recover를 호출하면 nil을 반환하고 아무 일도 일어나지 않습니다.
    하지만 현재 고루틴이 패닉 중이라면,
    recover는 panic에 전달된 값을 캡처하고 정상 실행을 재개합니다.

    예시 프로그램의 흐름을 볼까요.
    함수 g는 i가 3보다 크면 panic을 발생시키고,
    그렇지 않으면 i+1로 자기 자신을 재귀 호출합니다.

    함수 f는 deferred 함수 안에서 recover를 호출합니다.
    g(0) → g(1) → g(2) → g(3) → g(4)에서 panic이 터지면,
    스택을 따라 남겨진 defer들이 역순으로 실행되고,
    마지막으로 f의 recover가 panic 값 4를 잡아내 프로그램을 정상 종료시킵니다.

    출력 결과는 다음과 같습니다.
    Calling g.
    Printing in g 0
    Printing in g 1
    Printing in g 2
    Printing in g 3
    Panicking!
    Defer in g 3
    Defer in g 2
    Defer in g 1
    Defer in g 0
    Recovered in f 4
    Returned normally from f.

    만약 f에서 deferred recover를 제거하면 panic은 최상위까지 전파되어
    프로그램이 강제 종료됩니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📌 5. 실전에서의 활용 사례
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Go 표준 라이브러리의 json 패키지가 대표적인 예입니다.
    json 인코딩은 재귀 함수로 값을 순회하는데,
    중간에 에러가 발생하면 panic으로 스택을 언와인딩하고,
    최상위 함수에서 recover로 잡아 적절한 error 값을 반환합니다.

    또한 defer는 뮤텍스 해제(mu.Unlock), 푸터 출력(printFooter) 등
    다양한 정리 작업에 활용됩니다.

    Go 라이브러리의 관례는 날것의 panic을 남발하지 않고,
    패키지 낮부에서는 panic을 쓰더라도 외부 API에는 명시적인 error 반환값을 제공하는 것입니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📎 출처 링크
    https://go.dev/blog/defer-panic-and-recover

    #Go #Golang #defer #panic #recover #예외처리 #공식문서

    이 게시물을..
    N
    0
    0
    #go #defer #panic #recover #예외처리 #공식문서
    • [Rust 공식문서 한국어 정리] 150. Attribute Macros오뉴노노
    • 2
      오뉴노노

    오뉴노노 님의 최근 글

    [Rust 공식문서 한국어 정리] 184. PartialOrd 16 2026 06.08 [Rust 공식문서 한국어 정리] 183. Ord 13 2026 06.08 [Rust 공식문서 한국어 정리] 182. Eq 15 2026 06.08 [Rust 공식문서 한국어 정리] 181. PartialEq 15 2026 06.08 [Rust 공식문서 한국어 정리] 180. TryFrom 13 2026 06.08

    오뉴노노 님의 최근 댓글

    ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • [Rust 공식문서 한국어 정리] 150. Attribute Macros
    • 목록
      view_headline
    × CLOSE
    전체 던파 5 뮤 18 천상비 프로젝트신루 5 아이온 18 어둠의전설 28 리니지2 7 크로노스 5 칼온라인 3 기타 490
    기본 (582) 제목 날짜 수정 조회 댓글 추천 비추
    분류 정렬 검색
    • 포인트 획득 공지
      5
      2026.04.24 - 19:48 4953 5
    • 링크 업로드 관련 공지
      8
      2026.03.25 - 21:56 4715 8
    • 인증메일 공지
      3
      2026.03.15 - 16:42 4606 3
    • 파일링크 및 인증메일 발송 관련 문의 안내
      9
      2026.03.14 - 22:03 5259 9
    • 포인트 게시판 안내
      2026.02.28 - 19:14 5997
    • 게임존 사이트 변경 사항 안내
      9
      2026.02.26 - 01:07 7855 9
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:16 853
    582
    기타
    [Rust 공식문서 한국어 정리] 184. PartialOrd
    오뉴노노 2026.06.08 - 15:42 16
    581
    기타
    [Rust 공식문서 한국어 정리] 183. Ord
    오뉴노노 2026.06.08 - 15:42 13
    580
    기타
    [Rust 공식문서 한국어 정리] 182. Eq
    오뉴노노 2026.06.08 - 15:42 15
    579
    기타
    [Rust 공식문서 한국어 정리] 181. PartialEq
    오뉴노노 2026.06.08 - 15:42 15
    578
    기타
    [Rust 공식문서 한국어 정리] 180. TryFrom
    오뉴노노 2026.06.08 - 15:42 13
    577
    기타
    [Rust 공식문서 한국어 정리] 179. TryInto
    오뉴노노 2026.06.08 - 15:42 11
    576
    기타
    [Rust 공식문서 한국어 정리] 178. From
    오뉴노노 2026.06.08 - 15:39 14
    575
    기타
    [Rust 공식문서 한국어 정리] 177. Into
    오뉴노노 2026.06.08 - 15:39 9
    574
    기타
    [Rust 공식문서 한국어 정리] 176. AsRef
    오뉴노노 2026.06.08 - 15:39 5
    573
    기타
    [Rust 공식문서 한국어 정리] 175. Deref
    오뉴노노 2026.06.08 - 15:39 4
    572
    기타
    [Rust 공식문서 한국어 정리] 174. Default
    오뉴노노 2026.06.08 - 15:39
    571
    기타
    [Rust 공식문서 한국어 정리] 173. Clone
    오뉴노노 2026.06.08 - 15:38
    570
    기타
    [Rust 공식문서 한국어 정리] 172. Copy
    오뉴노노 2026.06.08 - 15:38
    569
    기타
    [Rust 공식문서 한국어 정리] 171. Drop
    오뉴노노 2026.06.08 - 15:38
    568
    기타
    [Rust 공식문서 한국어 정리] 170. Weak
    오뉴노노 2026.06.08 - 15:37
    567
    기타
    [Rust 공식문서 한국어 정리] 169. Arc
    오뉴노노 2026.06.08 - 15:37
    566
    기타
    [Rust 공식문서 한국어 정리] 168. Rc
    오뉴노노 2026.06.08 - 15:37
    565
    기타
    [Rust 공식문서 한국어 정리] 167. Box
    오뉴노노 2026.06.08 - 15:36
    564
    기타
    [Rust 공식문서 한국어 정리] 166. str
    오뉴노노 2026.06.08 - 15:36
    563
    기타
    [Rust 공식문서 한국어 정리] 165. String
    오뉴노노 2026.06.08 - 15:36
    562
    기타
    [Rust 공식문서 한국어 정리] 164. HashMap
    오뉴노노 2026.06.08 - 15:36 1
    561
    기타
    [Rust 공식문서 한국어 정리] 163. Vec
    오뉴노노 2026.06.08 - 15:35
    560
    기타
    [Rust 공식문서 한국어 정리] 162. Result
    오뉴노노 2026.06.08 - 15:35
    559
    기타
    [Rust 공식문서 한국어 정리] 161. Option
    오뉴노노 2026.06.08 - 15:35
    558
    기타
    [Rust 공식문서 한국어 정리] 160. Iterators
    오뉴노노 2026.06.08 - 15:35
    557
    기타
    [Rust 공식문서 한국어 정리] 159. Closures
    오뉴노노 2026.06.08 - 15:35
    556
    기타
    [Rust 공식문서 한국어 정리] 158. Trait Objects
    오뉴노노 2026.06.08 - 15:34
    555
    기타
    [Rust 공식문서 한국어 정리] 157. Lifetimes
    오뉴노노 2026.06.08 - 15:34 1
    554
    기타
    [Rust 공식문서 한국어 정리] 156. Cargo.lock
    오뉴노노 2026.06.08 - 15:34
    553
    기타
    [Rust 공식문서 한국어 정리] 155. Cargo.toml
    오뉴노노 2026.06.08 - 15:34 1
    552
    기타
    [Rust 공식문서 한국어 정리] 154. Workspaces
    오뉴노노 2026.06.08 - 15:34
    551
    기타
    [Rust 공식문서 한국어 정리] 153. Crates
    오뉴노노 2026.06.08 - 15:33
    550
    기타
    [Rust 공식문서 한국어 정리] 152. Modules
    오뉴노노 2026.06.08 - 15:33
    549
    기타
    [Rust 공식문서 한국어 정리] 151. Proc Macros
    오뉴노노 2026.06.08 - 15:32 1
    548
    기타
    [Rust 공식문서 한국어 정리] 150. Attribute Macros
    오뉴노노 2026.06.08 - 15:32
    547
    기타
    [Rust 공식문서 한국어 정리] 149. cfg
    오뉴노노 2026.06.08 - 15:32
    546
    기타
    [Rust 공식문서 한국어 정리] 148. assert
    오뉴노노 2026.06.08 - 15:31
    545
    기타
    [Rust 공식문서 한국어 정리] 147. panic
    오뉴노노 2026.06.08 - 15:27
    544
    기타
    [Rust 공식문서 한국어 정리] 146. Error
    오뉴노노 2026.06.08 - 15:24
    543
    기타
    [Rust 공식문서 한국어 정리] 145. Any
    오뉴노노 2026.06.08 - 15:22
    542
    기타
    [Rust 공식문서 한국어 정리] 144. Unpin
    오뉴노노 2026.06.08 - 15:19
    541
    기타
    [Rust 공식문서 한국어 정리] 143. Pin
    오뉴노노 2026.06.08 - 15:17 2
    540
    기타
    [Rust 공식문서 한국어 정리] 142. LazyLock
    오뉴노노 2026.06.08 - 15:14 1
    539
    기타
    [Rust 공식문서 한국어 정리] 141. OnceCell
    오뉴노노 2026.06.08 - 15:11
    538
    기타
    [Rust 공식문서 한국어 정리] 140. Atomic
    오뉴노노 2026.06.08 - 15:06
    537
    기타
    [Rust 공식문서 한국어 정리] 139. RwLock
    오뉴노노 2026.06.08 - 14:34 3
    536
    기타
    [Rust 공식문서 한국어 정리] 152. Modules
    오뉴노노 2026.06.08 - 14:00
    535
    기타
    [Rust 공식문서 한국어 정리] 151. Proc Macros
    오뉴노노 2026.06.08 - 14:00
    534
    기타
    [Rust 공식문서 한국어 정리] 150. Attribute Macros
    오뉴노노 2026.06.08 - 14:00 3
    533
    기타
    [Rust 공식문서 한국어 정리] 149. cfg
    오뉴노노 2026.06.08 - 14:00 3
    • 1 2 3 4 5 6 7 8 9 10 .. 12
    • / 12 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay