Skip to main content

error


Error

  • nil 또는 error interface를 구현한 struct를 반환합니다.
  • 마지막 인자로 반환합니다.
  • 고유명사, 함수명 등 대문자를 포함하는 경우를 제외하고 소문자로 작성합니다.
  • 구두점을 사용하지 않습니다.
info

github.com/pkg/errorserrors의 기능을 포함합니다. https://go.googlesource.com/proposal/+/master/design/go2draft-error-inspection.md 으로 인해 유지 보수만 한다고 합니다.

Sentinel Error

import (
"errors"
"fmt"
)

var (
ErrTestA = errors.New("test A")
ErrTestB = errors.New("test B")
ErrTestC = fmt.Errorf("test C: %w", ErrTestA)
)

더 이상 처리가 불가능하고, 오류를 설명하는 컨텍스트가 필요 없는 특정 상태가 됐을 때, 센티널 오류를 사용할 수 있습니다. 하지만 센티널 오류는 의존성 문제를 야기하기 때문에 사용에 신중해야합니다.

	switch {
case errors.Is(err, ErrTestA):
// ErrTestA, ErrTestC
case errors.Is(err, ErrTestB):
// ErrTestB
case errors.Is(err, ErrTestC):
// ErrTestC, Never happen
case err != nil:
// Etc
}

Error Type

import (
"errors"
)

type CustomError struct{
Code int
Message string
}

func (e *CustomError) Error() string {
return e.Message
}

동일한 형태의 정보를 가지는 다수의 오류가 있을 때, 오류 타입을 정의하여 사용할 수 있습니다. 센티널 오류와 마찬가지로 의존성 문제를 야기하기 때문에 사용에 신중해야합니다.

	var cerr *CustomError
switch {
case errors.As(err, &cerr):
// CustomError
case err != nil:
// Etc
}

Panic And Recover

func panic(v interface{})
func recover() interface{}
  • panic을 호출하면 현재 함수의 실행을 중단하고, panic 전에 defer로 등록된 함수들을 모두 실행한 후 콜스택을 타고 올라가며 실행을 중단합니다.
  • 실행이 중단된 함수들도 panic 전에 defer로 등록된 함수가 있다면 실행합니다.
  • recover가 호출 되면 recover 이후의 코드를 실행합니다.