我对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!
}
}
答案 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())
}