golang의 error 증강에 대해 얘기해 볼게요.

2933 단어 golang

순서


본고는 주로 golang의 error 강화를 연구하고자 한다

Errors in Go 1.13


golang의 1.13 버전은 error를 강화했습니다. 주로
  • Unwrap 방법을 도입했다
  • Is와 As를 늘리는 방법
  • fmt.Errorf 지원%w 포장 오류입니다

  • 인스턴스

    package main
    
    import (
        "errors"
        "fmt"
        "os"
    )
    
    var DemoErr = errors.New("test error stack")
    
    // https://itnext.io/golang-error-handling-best-practice-a36f47b0b94c
    func main() {
        if err := methodA(false); err != nil {
            fmt.Printf("%+v
    ", err) } if err := methodA(true); err != nil { fmt.Printf("%+v
    ", err) fmt.Printf("%+v
    ", errors.Unwrap(err)) fmt.Printf("%+v
    ", errors.Unwrap(errors.Unwrap(err))) fmt.Println("errors.Is(err, DemoErr)=", errors.Is(err, DemoErr)) fmt.Println("errors.As(err, &DemoErr)=", errors.As(err, &DemoErr)) var pe *os.PathError fmt.Println("errors.Is(err, pe)=", errors.Is(err, pe)) fmt.Println("errors.As(err, &pe)=", errors.As(err, &pe)) } } func methodA(wrap bool) error { if err := methodB(wrap); err != nil { if wrap { return fmt.Errorf("methodA call methodB error: %w", err) } return err } return nil } func methodB(wrap bool) error { if err := methodC(); err != nil { if wrap { return fmt.Errorf("methodB call methodC error: %w", err) } return err } return nil } func methodC() error { return DemoErr }

    출력
    test error stack
    methodA call methodB error: methodB call methodC error: test error stack
    methodB call methodC error: test error stack
    test error stack
    errors.Is(err, DemoErr)= true
    errors.As(err, &DemoErr)= true
    errors.Is(err, pe)= false
    errors.As(err, &pe)= false

    작은 매듭

  • 랩은 error를 포장했지만 창고가 포함되지 않았습니다
  • 오류에 대해 unwrap을 통해 판단합니다errors.Is function behaves like a comparison to a sentinel error
  • 유사한 유형의 단언 errors.As function behaves like a type assertion

  • doc

  • Errors
  • Working with Errors in Go 1.13
  • Error Handling in Go 1.13
  • Proposal: Go 2 Error Inspection
  • Golang error 분석
  • 좋은 웹페이지 즐겨찾기