• SEARCH

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

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

    [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 #예외처리 #공식문서
    • [Go 공식문서 한국어 정리] ⑤4. Go 명령어 도구오뉴노노
    • 0
      오뉴노노

    오뉴노노 님의 최근 글

    [Rust 공식문서 한국어 정리] ⑭. Rustlings 11 2026 05.30 [Rust 공식문서 한국어 정리] ⑬. The Unstable Book 11 2026 05.30 [Rust 공식문서 한국어 정리] ⑫. Rust Cookbook 9 2026 05.30 [Rust 공식문서 한국어 정리] ⑪. The Little Book of Rust Macros 4 2026 05.30 [Rust 공식문서 한국어 정리] ⑩. Rust Design Patterns 12 2026 05.30

    오뉴노노 님의 최근 댓글

    ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • [Go 공식문서 한국어 정리] ⑤4. Go 명령어 도구
    • 목록
      view_headline
    × CLOSE
    전체 던파 5 뮤 18 천상비 프로젝트신루 5 아이온 18 어둠의전설 28 리니지2 7 크로노스 5 칼온라인 3 기타 306
    기본 (305) 제목 날짜 수정 조회 댓글 추천 비추
    기타 정렬 검색
    • 포인트 획득 공지
      4
      2026.04.24 - 19:48 4639 4
    • 링크 업로드 관련 공지
      8
      2026.03.25 - 21:56 4496 8
    • 인증메일 공지
      2
      2026.03.15 - 16:42 4390 2
    • 파일링크 및 인증메일 발송 관련 문의 안내
      8
      2026.03.14 - 22:03 4984 8
    • 포인트 게시판 안내
      2026.02.28 - 19:14 5771
    • 게임존 사이트 변경 사항 안내
      9
      2026.02.26 - 01:07 7589 9
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:16 849
    305
    기타
    피파온라인 3 클라이언트
    lyw01234 2026.05.30 - 23:17 40
    304
    기타
    [Rust 공식문서 한국어 정리] ⑭. Rustlings
    오뉴노노 2026.05.30 - 08:38 11
    303
    기타
    [Rust 공식문서 한국어 정리] ⑬. The Unstable Book
    오뉴노노 2026.05.30 - 08:38 11
    302
    기타
    [Rust 공식문서 한국어 정리] ⑫. Rust Cookbook
    오뉴노노 2026.05.30 - 08:37 9
    301
    기타
    [Rust 공식문서 한국어 정리] ⑪. The Little Book of Rust Macros
    오뉴노노 2026.05.30 - 08:36 4
    300
    기타
    [Rust 공식문서 한국어 정리] ⑩. Rust Design Patterns
    오뉴노노 2026.05.30 - 08:36 12
    299
    기타
    [Rust 공식문서 한국어 정리] ⑨. Rust API Guidelines
    오뉴노노 2026.05.30 - 08:35 12
    298
    기타
    [Rust 공식문서 한국어 정리] ⑧. The Rust Performance Book
    오뉴노노 2026.05.30 - 08:34 7
    297
    기타
    [Rust 공식문서 한국어 정리] ⑦. Asynchronous Programming in Rust
    오뉴노노 2026.05.30 - 08:34 6
    296
    기타
    [Rust 공식문서 한국어 정리] ⑥. The Rust Edition Guide
    오뉴노노 2026.05.30 - 08:33 9
    295
    기타
    [Rust 공식문서 한국어 정리] ⑤. The Cargo Book
    오뉴노노 2026.05.30 - 08:32 1
    294
    기타
    [Rust 공식문서 한국어 정리] ④. The Rustonomicon
    오뉴노노 2026.05.30 - 08:32
    293
    기타
    [Rust 공식문서 한국어 정리] ③. The Rust Reference
    오뉴노노 2026.05.30 - 08:31
    292
    기타
    [Rust 공식문서 한국어 정리] ②. Rust By Example
    오뉴노노 2026.05.30 - 08:31
    291
    기타
    [Rust 공식문서 한국어 정리] ①. The Rust Programming Language (The Book)
    오뉴노노 2026.05.30 - 08:30 2
    290
    기타
    [Go 공식문서 한국어 정리] ⑤7. Codewalk: Share Memory By Communicating
    오뉴노노 2026.05.30 - 03:29 7
    289
    기타
    [Go 공식문서 한국어 정리] ⑤6. Codewalk: 마르코프 체인 텍스트 생성
    오뉴노노 2026.05.30 - 03:26 2
    288
    기타
    [Go 공식문서 한국어 정리] ⑤5. Codewalk: Go의 일급 함수
    오뉴노노 2026.05.30 - 03:25 1
    287
    기타
    [Go 공식문서 한국어 정리] ⑤4. Go 명령어 도구
    오뉴노노 2026.05.30 - 03:24 2
    286
    기타
    [Go 공식문서 한국어 정리] ⑤3. 통합 테스트 커버리지 프로파일링
    오뉴노노 2026.05.30 - 03:23 1
    • 1 2 3 4 5 6 7 8 9 10 .. 16
    • / 16 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay