2016-07-19 19 views
2

Go Langの開発はかなり新しいです。最近、私は今、上記のエラーが文字列を返す唯一の方法Error()を公開するのgetObjectGo LangでのAerospikeライブラリエラーの処理

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

にエアロスパイク囲碁クライアントを使用しています。私はそれぞれのタイプのエラーを別々に処理する必要があります。エラーコードが返されないので、これを行うにはどうすればいいですか?関連する型を取得するために文字列マッチングを行いますか?

解決策:下記の回答とコメントは、正確な回答を見つけるのに役立ちました。私はここでそれを他の人と共有します。 Aerospikeライブラリの輸出AerospikeError構造体。エラーはゼロまたはAerospikeErrorstructになる可能性があります。次のコードで作業が行われました。

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! 
    } 
} 
+4

関連/重複の可能性を:私の経験では、以下に示す簡潔な条件付きの型キャストは、独自のものと同じであるとはいえ、より読みやすい[標準のErr変数を持って行きますか。](http://stackoverflow.com/questions/30177860/does-go-have-standard-err-variables); [この回答に投稿された多数のリンク](http://stackoverflow.com/a/32080378/1705598)。 – icza

+0

@iczaので、基本的には、APIプロバイダがエラー処理のために提供する構造体の型に頼らざるを得ません。彼らが(この場合のように)わかりにくいエラーエラーを提供しない場合、私のオプションは何ですか? –

答えて

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 
} 
+0

私にとっては、すべてのエラーはAerespikeErrorタイプです。一般に、APIがさまざまな種類のエラーに対して異なる構造体を公開する場合、これが役に立ちます。 –

+1

次に、パッケージが 'err'を比較できるいくつかのエラー変数をエクスポートしているのを確認する必要があります。 – ain

+0

エラーコードがエクスポートされていることがわかりました。ヘルプありがとう –

2

Aerospike Go client dev here

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

ありがとう、これは確かに簡潔です。私はゴーの全面的なノブです。 –