Go 1.13 errors 기본 사용 방법

2623 단어 go1.13errorgolang
Go 최신 버전 1.13에는 errors의 일부 기능이 추가되어 업무 논리에서 잘못된 문제를 더욱 우아하게 처리하는 데 도움이 됩니다.
본문 주요 전시errors 가방에 추가된 방법의 사용법.

핵심 사상: 올가미


무슨 뜻이죠?이 물건은 마치 인형처럼 위에서 아래로 헤집고 하나 더 가져가고 하나 더 가져가세요. 에이 하나 더 있어요. 원한다면 맨 밑에 없을 때까지 계속 헤집으세요.

기본용법


1. 포장된 error 만들기


방식1: fmt.Errorf

%w 파라미터를 사용하여 포장된 error를 되돌려줍니다.
err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)
fmt.Println(err3)
// output
err3: [err2: [new error]]
err2는 합법적으로 포장된 error이다. 마찬가지로 err3도 포장된 error이다. 이렇게 하면 계속 포장할 수 있다.

방식 2: 사용자 정의 struct

type WarpError struct {
    msg string
    err error
}

func (e *WarpError) Error() string {
    return e.msg
}

func (e *WrapError) Unwrap() error {
    return e.err
}

이전에 원본 코드를 본 학우들은 이미 알고 있을 것이다. 이것이 바로 fmt/errors.go의warp에 관한 구조이다.간단하다Unwrap 방법을 실현한struct를 사용자 정의하면 됩니다.

2. 포장된 error를 뜯기


errors.Unwrap

err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Unwrap(err3))
fmt.Println(errors.Unwrap(errors.Unwrap(err3)))
// output
err2: [new error]
new error

3. 포장된 error가 지정한 오류를 포함하는지 판단


errors.Is


다중 호출이 되돌아오는 오류가 한 번씩 포장되면, 우리가 호출 체인에서 얻은 오류가 밑바닥의 어떤 오류인지 어떻게 판단합니까? Unwrap err , err , true。
err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Is(err3, err2))
fmt.Println(errors.Is(err3, err1))
// output
true
true

4. 지정된 유형의 오류 추출


errors.As


이것은 위errors.Is와 대체적으로 같다. 차이점은 Is는 엄격하게 상등, 즉 두 개error가 상등한지 아닌지를 판단하는 것이다.As는 유형이 같은지 판단하고 목표 유형에 부합되는 첫 번째 오류를 추출하여 특정한 오류를 통일적으로 처리한다.
type ErrorString struct {
    s string
}

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

var targetErr *ErrorString
err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})
fmt.Println(errors.As(err, &targetErr))
// output
true

확장


Is As 두 가지 방법은 사용자 정의errorstruct에서 호출을 실현하고 덮어쓸 수 있는 구멍을 미리 남겨 두었습니다.


원본도 할 말이 없다. 너무 간단해서 한눈에 알아볼 수 있다.

좋은 웹페이지 즐겨찾기