Error异常
Error的定义
- Golang Error VS 其它语言的Error
在其它开发语言中,异常对于程序是致命的。而对于golang异常则是在程序出现不期望的状态时的特殊返回值。
_
- error是golang内置的类型,它的零值是 nil
- error实际是一种接口类型,任何实现该接口的结构体都是error的子类型
type error interface {Error() string}
Error的使用
- 通过实现golang内置error接口的结构体实现Error
package mainimport "fmt"type MyError struct {}func (myError *MyError)Error() string{return "Somethings happen"}func main() {myError := &MyError{}fmt.Println(myError)}
- 通过使用内置模块 errors 中的 New 函数使用Error
package mainimport ("fmt""errors")func main() {myError := errors.New("Somethings happen")fmt.Println(myError)}
- 通过使用内置模块 fmt 中的 Errorf 函数使用Error
package mainimport "fmt"type MyError struct{}func (myError *MyError) Error() string {return "Some error happens"}func main() {myError := &MyError{}fmt.Println(myError)}
error 接口内嵌在结构体
package mainimport "fmt"type UnauthorizedError struct {UserId interror // error 内嵌在结构体中}func validateUser(userID int) error {err := fmt.Errorf("Session invalid for user %d", userID)return &UnauthorizedError{userID, err}}func main() {err := validateUser(1)if err != nil {fmt.Println(err)} else {fmt.Println("Succesfully")}}
error 内嵌到接口
package mainimport "fmt"// UserSessionState ...type UserSessionState interface {error // error 内嵌到接口中isLoggedIn() boolgetSessionId() int}// UnauthorizedError ...type UnauthorizedError struct{UserID intSessionID int}func (err *UnauthorizedError)isLoggedIn() bool {return err.SessionID != 0}func (err *UnauthorizedError)getSessionId() int{return err.SessionID}func (err *UnauthorizedError)Error() string{return fmt.Sprintf("User with id %v cannot perform current ation", err.SessionID)}func validateUser(userID int) error {return &UnauthorizedError{userID, 12312}}func main() {err := validateUser(123)if err != nil {fmt.Println(err)if errVal, ok := err.(UserSessionState); ok {...}} else {fmt.Println("User is allowed to perform this action")}}
为error添加track信息
package mainimport ("fmt""github.com/pkg/errors")func main() {originError := errors.New("123")fmt.Println(originError)// Wrap error messageerr := errors.Wrap(originError, "Context info use wrap func")fmt.Printf("normal => %v\n\n", err)// print with stack tracefmt.Printf("normal with stack trace %+v\n\n", err)// remove wraporiginErrorUnWrap := errors.Cause(err)fmt.Println(originErrorUnWrap)}
