[golang] panic과 recover로 try-catch 따라 하기

2024. 11. 21. 16:50·Language/Go

서론

많은 프로그래밍 언어에서 사용되는 try-catch는 개발자들에게 친숙한 예외 처리 방법이다. 하지만 Go 언어는 try-catch 구문을 제공하지 않고 error 타입을 반환하여 오류를 처리하도록 유도한다. Go는 panic과 recover를 제공하지만 공식 문서에서는 panic은 복구 불가능한 오류에서만 사용해야 하며 일반적인 오류 처리에는 사용하지 말라고 권장하고 있다. 이 글에서는 panic과 recover를 활용해 try-catch 스타일의 예외 처리 방식을 따라 해본다. 다만 이 방법은 권장되지 않으며 실제 개발에서는 사용을 피하고 재미로만 보는 것이 좋다.

 

Don’t Panic
Don’t use panic for normal error handling. Use error and multiple return values.

 

Try-Catch 따라 하기

package main

import (
    "fmt"
    "os"
)

type ExceptionHandler struct {
    Err error
}

func Try(fn func()) (e ExceptionHandler) {
    defer func() {
        if r := recover(); r != nil {
            e.Err = fmt.Errorf("%v", r)
        }
    }()

    fn()
    return e
}

func (e ExceptionHandler) Catch(fn func(error)) {
    if e.Err != nil {
        fn(e.Err)
    }
}

func main() {
    Try(func() {
        fmt.Println("Try!")
        f, err := os.Open("nofile")
        if err != nil {
            panic(err)
        }
        defer f.Close()

        _, err = f.Write([]byte("Jae-Sung"))
        if err != nil {
            panic(err)
        }
    }).Catch(func(err error) {
        fmt.Println("Catch:", err.Error())
    })
}

이 예제에서는 Try와 Catch를 사용하여 예외 처리를 구현하고 있다. Try는 우리가 원하는 작업을 실행하고 만약 작업 중에 오류가 발생하면 panic을 발생시킨다. 이 panic은 다른 언어에서 사용하는 exception과 유사하게 동작하여 Catch에서 발생한 오류를 처리한다. 이렇게 해서 마치 다른 언어에서 흔히 볼 수 있는 try-catch 구문처럼 동작하는 방식으로 따라 해봤다.

 

마무리

이번 예제에서 panic을 사용하여 예외를 발생시키고, recover를 통해 예외를 처리하는 방식으로 다른 언어들에 있는 try-catch를 따라 해봤다. 하지만 이 방법은 Go 언어에서 권장되는 방식이 아니므로 실제 개발에서는 이 방법을 사용하기보다는 Go의 고유한 오류 처리 패턴을 따르는 것이 더 바람직하다. Go는 error 타입을 반환하여 오류를 처리하는 방식을 권장하며, 이는 코드의 가독성을 높이고 프로그램 흐름을 더 명확하게 만든다.

'Language > Go' 카테고리의 다른 글

[golang] Base64 인코딩과 디코딩 처리하기  (0) 2024.11.23
[golang] 런타임에 콜 스택 출력하기  (1) 2024.11.22
[golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리  (1) 2024.11.20
[golang] flag 패키지로 명령줄 옵션 처리하기  (0) 2024.11.19
[golang] Go 언어 철학에서 switch문이 살아 남은 이유  (3) 2024.11.18
'Language/Go' 카테고리의 다른 글
  • [golang] Base64 인코딩과 디코딩 처리하기
  • [golang] 런타임에 콜 스택 출력하기
  • [golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리
  • [golang] flag 패키지로 명령줄 옵션 처리하기
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    interface{}
    fasthttp
    티스토리챌린지
    go
    Runtime
    recover
    http
    filepath
    unsafe
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] panic과 recover로 try-catch 따라 하기
상단으로

티스토리툴바