개인공부/language

[GO] 에러 핸들링 방법

파뱁 2024. 11. 25. 22:18
728x90

고랭에서 에러 핸들링을 하기 위해서는 먼저 "errors" 라는 패키지를 import 해야한다.

지난 번에 작성한 greetings.go에 errors를 import 해보자

 

package greetings

import (
    "errors"
    "fmt"
)

 

그 다음 우리는 다음과 같은 상황에서 에러를 뱉을 것이다.

[이름 변수에 빈 값이 들어올 경우]

 

if name == "" {
    return "", errors.New("empty name")
}

 

그리고 이 코드를 가지고 있는 함수는 error를 뱉을 수 있기 때문에 함수를 다음과 같이 작성한다.

// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {
    // If no name was given, return an error with a message.
    if name == "" {
        return "", errors.New("empty name")
    }

    // If a name was received, return a value that embeds the name
    // in a greeting message.
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message, nil
}

 

나의 궁예.. 로는 throws Exceptions 와 비슷한 의미로 보이긴 한다...

 

위 함수는 두 가지 값을 리턴하는데, 하나는 실제 메시지 이고, 하나는 nil 이다.

(여기서 알수 있듯이 고랭은 리턴 값이 하나가 아닐 수 있다. nil 뿐만 아니고, 모든 함수는 다양한 값들을 리턴할수 있다. - 우왕)

 

nil 이 의미 하는 바는 에러가 없이 함수가 성공적으로 리턴되었음을 알려준다.

해당 인자로 우리는 함수가 정상 동작했는지 판단이 가능하다.

 

이제 뱉은 에러를 에러로그로서 찍어볼 예정이다.

 

hello.go 가 greetings를 call 하고 있기 때문에 hello.go에 에러로그를 찍어볼것이다.

 

import (
    "fmt"
    "log"
    
    "example.com/greetings"
)

 

로그를 찍으려면 위 코드 처럼 "log"를 import 하면 된다.

 

이제 main 함수에 에러가 났을 경우 에러 로그를 추가 하겠다.

func main() {
    // Set properties of the predefined Logger, including
    // the log entry prefix and a flag to disable printing
    // the time, source file, and line number.
    log.SetPrefix("greetings: ")
    log.SetFlags(0)

    // Request a greeting message.
    message, err := greetings.Hello("")
    // If an error was returned, print it to the console and
    // exit the program.
    if err != nil {
        log.Fatal(err)
    }

    // If no error was returned, print the returned message
    // to the console.
    fmt.Println(message)
}

 

여기서 볼수 있듯이 로그의 prefix를 설정 할수 이다.

우리는 이 prefix를 통해 로그 검색을 용이 하게 만들 수 있다.

 

디폴트로 다음과 같이 날짜와 시간을 로그에 추가해주지만

[2016/01/15 16:04:08 Logging]

굳이 이 시간을 없애고자 한다면 위 코드 처럼 log.SetFlags(0)으로 세팅해주면 된다.

 

greeting.hello() 함수는 리턴값이 두개 임으로 각각의 값을 담을 변수를 순서대로 선언해준 다음 함수를 사용한다.

 

그리고 여기서 선언한 err는 에러 여부를 담고 있는데, err가 nil 이 아니라면 에러를 리턴한 것으로 판단할 수 있기 때문에

해당 조건으로 에러 분기를 진행하고,

만약 에러라면 log.Fatal()을 통해 에러로그를 출력하고 바로 exit할 수 있도록 한다.

 

참고) log.Fatal()에 대한 추가 설명

https://pkg.go.dev/log#Fatal

 

log package - log - Go Packages

Discover Packages Standard library log Version: go1.23.3 Opens a new window with list of versions in this module. Published: Nov 6, 2024 License: BSD-3-Clause Opens a new window with license information. Imports: 8 Opens a new window with list of imports.

pkg.go.dev

 

그리고 에러가 없다면, 원래의 메시지를 출력하는 것으로 마무리를 짓는다.

 

해당 코드를 돌리면, name이 빈 칸이기 때문에, 에러를 뱉고 프로그램을 exit 한다.

 

참고로 log.SetFlags(0)를 세팅 하지 않는 다면 다음처럼 에러로그를 찍는다.

 

 

728x90
반응형

'개인공부 > language' 카테고리의 다른 글

[GO] 배열 선언하기  (0) 2024.12.04
[GO] 로컬 패키지 호출 방법  (0) 2024.11.19
[GO] 함수 기본 작성법  (2) 2024.11.12
[GO] 모듈과 패키지  (0) 2024.11.05
[JAVA] ArrayList가 비어있는지 확인 하기  (0) 2024.02.27