处理Go Lang中的Aerospike库错误

时间:2016-07-19 08:30:23

标签: go error-handling aerospike

我对Go Lang的发展很陌生。最近我使用Aerospike Go客户端来获取getObject

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

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

解决方案:下面的回答和评论帮助我找到了确切的答案。我将在这里与其他人分享。 Aerospike库导出AerospikeError结构。现在,错误可能是零或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!
    }
}

2 个答案:

答案 0 :(得分:2)

如果函数返回实际上不同类型的错误,那么您应该使用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
}

答案 1 :(得分:2)

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

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