golang의 error 포장에 대해서 얘기를 해볼게요.

2507 단어 golang

순서


본고는 주로 golang의 error 포장을 연구한다

error

type error interface {
    Error() string
}

error 인터페이스에서 Error 방법을 정의하고string을 되돌려줍니다.

runtime.Error

package runtime

type Error interface {
    error
    // and perhaps other methods
}

패닉에 대해 발생하는 것은runtime이다.Error, 이 인터페이스에 error 인터페이스 내장

wrap

package main

import (
    "errors"
    "fmt"

    pkgerr "github.com/pkg/errors"
)

func main() {
    if err := methodA(false); err != nil {
        fmt.Printf("%+v", err)
    }
    if err := methodA(true); err != nil {
        fmt.Printf("%+v", err)
    }
}

func methodA(wrap bool) error {
    if err := methodB(wrap); err != nil {
        if wrap {
            return pkgerr.Wrap(err, "methodA call methodB error")
        }
        return err
    }
    return nil
}

func methodB(wrap bool) error {
    if err := methodC(); err != nil {
        if wrap {
            return pkgerr.Wrap(err, "methodB call methodC error")
        }
        return err
    }
    return nil
}

func methodC() error {
    return errors.New("test error stack")
}

내장된 errors를 사용하면 창고를 인쇄할 수 없습니다.pkg/errors를 사용하여 스택 휴대 가능
출력
test error stack
test error stack
methodB call methodC error
main.methodB
        /error-demo/error_wrap.go:33
main.methodA
        /error-demo/error_wrap.go:21
main.main
        /error-demo/error_wrap.go:15
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1374
methodA call methodB error
main.methodA
        /error-demo/error_wrap.go:23
main.main
        /error-demo/error_wrap.go:15
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1374% 

작은 매듭

  • error 인터페이스는 Error 방법을 정의하고string을 되돌려줍니다.패닉에 대해 발생하는 것은runtime이다.Error, 이 인터페이스에 error 인터페이스가 있습니다
  • 내장된 errors를 사용하면 창고를 인쇄할 수 없습니다.pkg/errors를 사용하면 창고를 휴대할 수 있습니다

  • doc

  • Errors
  • pkg/errors
  • Embedding Interfaces in Go (Golang)
  • 좋은 웹페이지 즐겨찾기