Go: 예외처리

dev_314·2023년 4월 21일
0

Golang - Trial and Error

목록 보기
1/5

참고
한 눈에 끝내는 고랭 기초 - 에러 처리의 기본

error interface & errors package

package main

import "fmt"

func main() {
	input := 0
	count, err = fmt.Scanln(&input)
    1
    if err != nil {
    	return
    }
    ...
}

// builtin.go

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
	Error() string
}

fmt.Scanln 반환하는 에러 객체는 error 인터페이스이다.
Go는 error 인터페이스 구현체를 제공하는데, 이것이 erros 패키지의 errorString이다.

// because the former will succeed if err wraps an *fs.PathError.
package errors

// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
	return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}

그래서 다음의 방법으로 에러를 반환할 수 있다.

package main

import (
	"fmt"
    "errors"
)

func main() {
	var a, b int
    nm err := fmt.Scanln(&a, &b)
    
    if err != nil {
    	panic(err)
    }
    
	result, err2 := getResult(a, b)
    
    if err2 != nil {
    	panic(err2)
    }
}

func getResult(a int, b int) (int, error) {
	if a == 0 {
    	return -1, errors.New("a should not be zero")
    }
    return a + b
}

log package

위 코드처럼 panic을 사용하면 프로그램이 종료된다.

의도에 따라 틀린 방법은 아닌데, 보통은 예외처리를 위해 log 패키지 기능을 사용한다.

package mina

import "log"

func main() {

	log.Print(err) // log.Println(err)
    log.Fatal(err)
    log.Panic(err)
}

크게 3가지 종류의 함수를 제공한다.

Print

시간, 에러 정보를 출력하고 계속 프로그램이 진행된다.

Fatal

시간, 에러 정보를 출력하고 정상적으로 프로그램이 종료된다.

Panic

시간, 에러 정보를 출력하고 Panic을 발생시킨다. defer 구문이 없다면 런타임 패닉이 발생하고 비정상적으로 프로그램이 종료된다.

즉, Panic()을 호출한 것과 동일하다.

package main

import (
	"errors"
	"fmt"
	"log"
)

func main() {
	var input1, input2 int
	_, err1 := fmt.Scanln(&input1, &input2)

	if err1 != nil {
		log.Fatal(err1) // 에러가 있으면 그냥 종료
	}

	defer panicHandler()

	result, err2 := getResult(input1, input2)

	if err2 != nil {
		log.Panic(err2) // 에러가 있으면 Panic호출
	}

	fmt.Println("result is : ", result)
}

func getResult(input1 int, input2 int) (int, error) {
	if input1 == 0 {
		return -1, errors.New("input1 should not be zero")
	}
	return input1 + input2, nil
}

func panicHandler() {
	fmt.Println("handle panic situation")
}

실행 결과는 다음과 같다.

// log.Panic(err2)으로 출력된 에러 메시지
2023/04/22 14:56:21 input1 should not be zero
// defer 구문을 사용해서 main 메서드 종료 전에 호출된 panicHanlder
handle panic situation
// panic을 호출했으므로 에러 메시지가 출력되고 비정상 종료
panic: input1 should not be zero
profile
블로그 이전했습니다 https://dev314.tistory.com/

0개의 댓글