서론
많은 프로그래밍 언어에서 사용되는 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 |