错误具体类型

时间:2014-07-05 18:51:32

标签: go

我有一个方法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
}

3 个答案:

答案 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 
}

注意:即使在nilerr == 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)
}

去游乐场:http://play.golang.org/p/5-OQ3hxmZ5