2017-04-25 9 views
3

で特定のエラーをcatch`方法、私のように1つのgolang標準ライブラリ関数を使用しています:`たとえばgolang

func Dial(network, address string) (*Client, error) 

この関数はエラーを返すことが、私はちょうどレポート「接続が失われたエラーを気に"または"接続が拒否されました "、次にこれらを修正するコードを実行します。
それはのように思える:

client, err := rpc.Dial("tcp", ":1234") 
if err == KindOf(ConnectionRefused) { 
    // do something 
} 

特定の標準ライブラリ関数が返す可能性のあるすべてのエラーを取得する方法を、より多くの何ですか?

+0

https://tour.golang.org/methods/15 https://tour.golang.org/methods/16 – zerkms

+0

「net」パッケージ作成者に部分的に責任がある直接的/正確な回答はありません。関連する/有用な質問(エラー処理について):[特にタイムアウトエラーをチェックする](http://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error); [標準のErr変数はありますか?](http://stackoverflow.com/questions/30177860/does-go-have-standard-err-variables/30178766#30178766);じゃ、行け。複数の抽象レベルからエラーを処理するためのベストプラクティス](http://stackoverflow.com/questions/37346694/go-best-practice-to-handle-error-from-multiple-abstract-level/37347531#37347531)。 – icza

答えて

2

標準的な方法はありません。

if err.Error() == "connection lost" { ... } 

それとも、より堅牢に、いくつかの状況で:

他の方法が利用できない場合にのみ使用されるべき最も明白な方法は、あなたが期待するものに対してエラー文字列を比較することである

if strings.HasSuffix(err.Error(), ": connection lost") { ... } 

しかし、多くのライブラリが特定のエラータイプを返すため、これははるかに簡単です。あなたのケースでは

、どのような関連するのはnetパッケージによってエクスポートさまざまなエラータイプされている:あなたは、おそらくネットワークエラーのために使用されているnet.Error、最も関心などAddrErrorDNSConfigErrorDNSErrorError

。だからは以下のようなものをチェックすることもできます

if _, ok := err.(net.Error); ok { 
    // You know it's a net.Error instance 
    if err.Error() == "connection lost" { ... } 
} 

を特定の標準ライブラリ関数が返す可能性のあるすべてのエラーを取得する方法を、より多くの何ですか?

これを実行する唯一の方法は、ライブラリのソースを読み取ることです。その極端に行く前に、最初のステップは単にゴドックを読むことです。netパッケージの場合、エラーはかなりよく記録されています。