error
Error
nil
또는error
interface를 구현한 struct를 반환합니다.- 마지막 인자로 반환합니다.
- 고유명사, 함수명 등 대문자를 포함하는 경우를 제외하고 소문자로 작성합니다.
- 구두점을 사용하지 않습니다.
info
github.com/pkg/errors
는 errors
의 기능을 포함합니다. 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 이후의 코드를 실행합니다.