我有功能1:
func Function1() {
if err := Function2(); err != nil {
}
}
和功能2:
func Function2() error {
if err := doSomethingThatMightCauseError(); err != nil {
return errors.New("Error Type 1")
}
if err := doSomethingElseThatMightCauseError(); err != nil {
return errors.New("Error Type 2")
}
}
如何检测发生了什么类型的错误(内部,在db等中找不到结果)然后在功能1中进行相应处理?
答案 0 :(得分:5)
您有3个主要选项:
基于字符串,即查看消息。这当然非常糟糕,因为如果你以后更改了邮件中的一个字母,你需要重写所有的检查代码,所以我会避免它。
如果错误消息可以保持不变,只需将错误创建为全局变量,然后将收到的错误与已知的预定错误进行比较。
例如:
var ErrDB = errors.New("Database Error")
var ErrTimeout = errors.New("Timeout") //or whatever
然后
if err := someFunc(); err != nil {
switch err {
case ErrDB:
//do stuff that needs to be done here
case ErrTimeout:
//etc /etc
}
}
例如:
const (
ErrDB = 1
ErrTimeout = 2
...
)
type MyError struct {
Code int
Message string
}
// This is what you need to be an error
func (e MyError)Error() string {
return e.Message
}
func NewError(s string, code int) error {
return MyError{s,code}
}
然后当你返回时它会做这样的事情:
// Return a MyError with a DB code for db operations
func someFunc() error {
if err := talkToDB(); err != nil {
return NewError(err.Error(), ErrDB)
}
return nil
}
并在分析时:
if err := someFunc(); err != nil {
// check if this is a MyError
if me, ok := err.(MyError); ok {
// now we can check the code
switch me.Code {
case ErrDB:
//handle this
....
}
}
}