首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错混凝土型

错混凝土型
EN

Stack Overflow用户
提问于 2014-07-05 18:51:31
回答 3查看 305关注 0票数 3

我有一个方法CreateProduct(&Product) error,它返回实现error接口的值。它可以是gorm数据库错误,也可以是我自己的错误类型。

有了返回的值,我如何才能知道哪种类型是错误?

代码语言:javascript
复制
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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-05 18:56:40

如果返回的错误来自预期类型,则可以执行类型断言

代码语言:javascript
复制
if nerr, ok := err.(yourError); ok  {
  // do something
}

您还可以为多个测试执行类型开关

代码语言:javascript
复制
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),其中ZT类型的零值。

在这里,"Error“的”零值“将是nil

票数 3
EN

Stack Overflow用户

发布于 2014-07-05 18:58:03

您可以使用类型断言这样做:

代码语言:javascript
复制
if gormError, ok := err.(gorm.RecordNotFound); ok {
   // handle RecordNotFound error
}

if myError, ok := err.(MyError); ok {
   // handle MyError
}

在处理多个错误情况时,可以使用类型开关

代码语言:javascript
复制
switch actualError := err.(type) {
case gorm.RecordNotFound:
    // handle RecordNotFound
case MyError:
    // handle MyError
case nil:
    // no error
}
票数 3
EN

Stack Overflow用户

发布于 2014-07-05 19:03:14

就像你使用任何其他接口一样。使用类型断言或类型切换:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24589566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档