Error异常
Error的定义
- Golang Error VS 其它语言的Error
在其它开发语言中,异常对于程序是致命的。而对于golang异常则是在程序出现不期望的状态时的特殊返回值。
_
- error是golang内置的类型,它的零值是 nil
- error实际是一种接口类型,任何实现该接口的结构体都是error的子类型
type error interface {
Error() string
}
Error的使用
- 通过实现golang内置error接口的结构体实现Error
package main
import "fmt"
type MyError struct {}
func (myError *MyError)Error() string{
return "Somethings happen"
}
func main() {
myError := &MyError{}
fmt.Println(myError)
}
- 通过使用内置模块 errors 中的 New 函数使用Error
package main
import (
"fmt"
"errors"
)
func main() {
myError := errors.New("Somethings happen")
fmt.Println(myError)
}
- 通过使用内置模块 fmt 中的 Errorf 函数使用Error
package main
import "fmt"
type MyError struct{}
func (myError *MyError) Error() string {
return "Some error happens"
}
func main() {
myError := &MyError{}
fmt.Println(myError)
}
error 接口内嵌在结构体
package main
import "fmt"
type UnauthorizedError struct {
UserId int
error // 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 main
import "fmt"
// UserSessionState ...
type UserSessionState interface {
error // error 内嵌到接口中
isLoggedIn() bool
getSessionId() int
}
// UnauthorizedError ...
type UnauthorizedError struct{
UserID int
SessionID 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 main
import (
"fmt"
"github.com/pkg/errors"
)
func main() {
originError := errors.New("123")
fmt.Println(originError)
// Wrap error message
err := errors.Wrap(originError, "Context info use wrap func")
fmt.Printf("normal => %v\n\n", err)
// print with stack trace
fmt.Printf("normal with stack trace %+v\n\n", err)
// remove wrap
originErrorUnWrap := errors.Cause(err)
fmt.Println(originErrorUnWrap)
}