【问题标题】:Handling Aerospike library errors in Go Lang在 Go 语言中处理 Aerospike 库错误
【发布时间】:2016-07-19 08:30:22
【问题描述】:

我对 Go Lang 开发还很陌生。最近我在使用 Aerospike Go 客户端来获取对象

err = aer.AeroDB.getObject(nil, key, Record)
if err != nil {
    fmt.Println(err)
}

现在上面的错误只暴露了一个方法Error(),它返回一个字符串。我需要以不同的方式处理每种类型的错误。我该怎么做,因为没有返回错误代码。我是否进行字符串匹配以获得相关类型?

解决方案: 下面的答案和 cmets 帮助我找到了准确的答案。我将在这里与其他人分享。 Aerospike 库导出 AerospikeError 结构。现在,error 可能是 nil 或 AerospikeError struct。以下代码完成了工作。

import (
  "errors"
  "fmt"
  aerospike "github.com/aerospike/aerospike-client-go"
  "github.com/aerospike/aerospike-client-go/types"
 )

type ArDB struct {
  Host   string
  Port   int
  AeroDB *aerospike.Client
}

ArErr, failed := aer.AeroDB.GetObject(nil, key, Record).(types.AerospikeError)
if failed {
    if ArErr.ResultCode() == types.KEY_NOT_FOUND_ERROR {
        //Key is not present, create new data
        Record = NewAudienceRecord()
    } else {
        //Handle other errors!
    }
}

【问题讨论】:

标签: go error-handling aerospike


【解决方案1】:

如果函数返回的错误实际上是不同类型的,那么你应该使用type switch:

switch err.(type) {
case Error1:
    fmt.Println("Error1", err)
case Error2:
    fmt.Println("Error2", err)
default:
    fmt.Println(err)
}

但是如果错误属于同一类型,那么您必须查看包是否将一些“常见错误”导出为变量,以便您可以检查这些错误:

if err == aer.Error1 {
   // do something specific to Error1
}

【讨论】:

  • 对我来说所有的错误都是 AerespikeError 类型的。一般来说,如果 API 为不同类型的错误公开不同的结构,这会有所帮助。
  • 那你得看看包有没有导出一些错误变量,你可以对比err
  • 刚发现他们导出了错误码。感谢您的帮助
【解决方案2】:

Aerospike Go 客户端开发在这里。根据我的经验,下面显示的简洁条件类型转换更具可读性,尽管与您自己的相同:

if ae, ok := err.(AerospikeError); ok {
    println(ae.ResultCode())
}

【讨论】:

  • 谢谢,这当然很简洁。我是围棋的菜鸟。
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2015-07-23
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多