[go] go 언어의 에러 처리

Go 언어는 강력하고 유연한 에러 처리 메커니즘을 제공합니다. 이를 통해 코드에서 발생하는 에러를 쉽게 식별하고 처리할 수 있습니다. 이번 글에서는 Go 언어에서의 에러 처리 방법과 관련된 내용에 대해 알아보겠습니다.

1. 에러 정의하기

Go에서 에러는 error 타입을 가집니다. 보통 다음과 같은 방식으로 에러를 정의합니다.

package main

import (
    "errors"
    "fmt"
)

func divide(x, y int) (int, error) {
    if y == 0 {
        return 0, errors.New("division by zero")
    }
    return x / y, nil
}

func main() {
    result, err := divide(6, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

위의 예시에서 divide 함수는 두 정수를 나누고 그 결과를 반환합니다. 만약 두 번째 인자인 y가 0이라면 에러를 반환하는데, 이때 errors.New 함수를 사용하여 에러 메시지를 생성하여 반환하게 됩니다.

2. 에러 처리하기

파생된 에러를 처리하거나 새로운 에러를 생성하고자 할 때 errors.New 함수보다 fmt.Errorf 함수를 사용하는 것이 더 유용할 수 있습니다.

package main

import (
    "fmt"
)

func divide(x, y int) (int, error) {
    if y == 0 {
        return 0, fmt.Errorf("division by zero, y is %d", y)
    }
    return x / y, nil
}

func main() {
    result, err := divide(6, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

fmt.Errorf 함수를 사용하면 포맷 문자열과 함께 에러 메시지를 생성하여 반환할 수 있어 가독성이 좋아집니다.

3. 커스텀 에러 타입 정의하기

좀 더 구체적인 에러 처리를 위해 커스텀 에러 타입을 정의하여 사용할 수도 있습니다.

package main

import (
    "fmt"
)

type myError struct {
    message string
}

func (e *myError) Error() string {
    return e.message
}

func divide(x, y int) (int, error) {
    if y == 0 {
        return 0, &myError{"division by zero"}
    }
    return x / y, nil
}

func main() {
    result, err := divide(6, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

위의 예시에서 myError 타입을 정의하여 사용하고 있습니다. 이러한 방식으로 커스텀 에러 타입을 정의하면 보다 구체적인 에러 처리가 가능해집니다.

Go 언어에서의 에러 처리는 유연하고 강력한데, 위에서 언급한 방법들을 사용하여 코드의 안정성을 높일 수 있습니다.

이상으로 Go 언어의 에러 처리에 대한 내용을 알아보았습니다. 어떠한 문제가 발생할지에 대비하여 적절한 에러 처리를 하여 안정적인 코드를 작성할 수 있도록 노력해 보세요.