我有一个方法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
}发布于 2014-07-05 18:56:40
如果返回的错误来自预期类型,则可以执行类型断言:
if nerr, ok := err.(yourError); ok {
// do something
}您还可以为多个测试执行类型开关。
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。
发布于 2014-07-05 18:58:03
您可以使用类型断言这样做:
if gormError, ok := err.(gorm.RecordNotFound); ok {
// handle RecordNotFound error
}
if myError, ok := err.(MyError); ok {
// handle MyError
}在处理多个错误情况时,可以使用类型开关:
switch actualError := err.(type) {
case gorm.RecordNotFound:
// handle RecordNotFound
case MyError:
// handle MyError
case nil:
// no error
}发布于 2014-07-05 19:03:14
就像你使用任何其他接口一样。使用类型断言或类型切换:
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)
}围棋游乐场:http://play.golang.org/p/5-OQ3hxmZ5
https://stackoverflow.com/questions/24589566
复制相似问题