我有一个方法CreateProduct(&Product) error
,它返回一个实现error
接口的值。它可能是gorm
数据库错误或我自己的错误类型。
有了返回值,我怎么知道哪个类型是错误?
err = api.ProductManager.CreateProduct(product)
if err != nil {
// TODO: how to distinguish that it is a validation error?
response.WriteHeader(422)
response.WriteJson(err)
return
}
答案 0 :(得分:3)
您可以执行 type assertion ,如果返回的错误来自预期类型,则会执行操作:
if nerr, ok := err.(yourError); ok {
// do something
}
您还可以执行 type switch 进行多项测试
switch t := err.(type) {
case yourError:
// t is a yourError
case otherError :
// err is an otherError
case nil:
// err was nil
default:
// t is some other type
}
注意:即使在nil
(err == nil
时)也可以进行类型断言:
断言的结果是一对类型
(T, bool)
的值。
- 如果断言成立,则表达式返回
(x.(T), true)
对;- 否则,表达式返回
(Z, false)
,其中Z
是类型T
的零值
此处,“Error
”的“零值”为nil
。
答案 1 :(得分:3)
您可以使用type assertions执行此操作:
if gormError, ok := err.(gorm.RecordNotFound); ok {
// handle RecordNotFound error
}
if myError, ok := err.(MyError); ok {
// handle MyError
}
在处理多个错误案例时,使用type switches可能很有用:
switch actualError := err.(type) {
case gorm.RecordNotFound:
// handle RecordNotFound
case MyError:
// handle MyError
case nil:
// no error
}
答案 2 :(得分:0)
与使用任何其他界面的方式相同。使用类型断言或类型开关:
switch err := err.(type) {
case MyValidationError:
fmt.Printf("validation error")
case MyOtherTypeOfError:
fmt.Printf("my other type of error")
default:
fmt.Printf("error of type %T", err)
}