2015-11-02 19 views
7

私はgolangを初めて使用しています。私のアプリケーションはループ内で複数のエラーを返す必要があり、後で組み合わせて単一のエラー文字列として返す必要があります。文字列関数を使用してエラーメッセージを結合することができません。返す前にこれらのエラーを単一のエラーに結合するにはどのような方法が使えますか?複数のエラー文字列を組み合わせる

package main 

import (
    "fmt" 
    "strings" 
) 

func Servreturn() (err error) { 

    err1 = fmt.Errorf("Something else occured") 
    err2 = fmt.Errorf("Something else occured again") 

    // concatenate both the error 

    return err3 

} 
+0

情報が不十分です。クライアントは何をしていますか?あなたのサーバーは何をしていますか?サンプル出力。 – ZAky

答えて

6

このスライスを達成するには、strings.Join()append()機能を使用できます。

example: golang playgorund

package main 

import (
    "fmt" 
    "strings" 
    "syscall" 
) 

func main() { 

    // create a slice for the errors 
    var errstrings []string 

    // first error 
    err1 := fmt.Errorf("First error:server error") 
    errstrings = append(errstrings, err1.Error()) 

    // do something 
    err2 := fmt.Errorf("Second error:%s", syscall.ENOPKG.Error()) 
    errstrings = append(errstrings, err2.Error()) 

    // do something else 
    err3 := fmt.Errorf("Third error:%s", syscall.ENOTCONN.Error()) 
    errstrings = append(errstrings, err3.Error()) 

    // combine and print all the error 
    fmt.Println(fmt.Errorf(strings.Join(errstrings, "\n"))) 


} 

これでしょう出力は、クライアントに送り返すことができ、単一の文字列。

First error:server1 
Second error:Package not installed 
Third error:Socket is not connected 

これが役に立ちます。

9

エラーは実際にはError()関数を実装するインターフェイスであるため、エラー時には文字列関数は機能しません。

文字列関数は、err1.Error()およびerr2.Error() では使用できますが、 "err1"参照自体では使用できません。

いくつかのエラーは、データベースドライバから得られるような構造体です。

文字列関数が実際には文字列でない可能性があるため、文字列関数をエラーに使用する自然な方法はありません。 2つのエラーの組み合わせについては

簡単に、もう一度fmt.Errorfを使用しています。

fmt.Errorf("Combined error: %v %v", err1, err2) 

代わり:

errors.New(err1.Error() + err2.Error()) 
+0

fmt.Errorf()以外の方法は、文字列関数を使用できないのはなぜですか? –

+0

「結合する」ことが本当に意味することに依存します。文字列の連結は '+'演算子を使って行われます。あるいは、スライスに個別に格納し、値をappend()することもできます。 *この質問はGoのチュートリアルを通して自分自身で作業し、その本を手に入れることを示唆しています。 – kostix

+1

@GregPetrこれを行うもう一つの方法は、エラーのリストをフィールドとして受け取り、 'Error()string'メソッドを実装し、文字列を連結するかどうかを問わず、あなたが望むことをする独自の' CombinedError'構造体を持つことです。 –

3

@WillCがerrorがインタフェース型であるとして、あなた自身のerrorタイプを定義することが可能であるコメントで述べたものに展開します。 Error() string関数を実装するすべての型は、errorインターフェイスを実装します。したがって、エラーを集約し、連結エラー文字列を返すCollectionErrorを作成することができます。

type ErrorCollector []error 

func (c *ErrorCollector) Collect(e error) { *c = append(*c, e) } 

func (c *ErrorCollector) Error() (err string) { 
    err = "Collected errors:\n" 
    for i, e := range *c { 
     err += fmt.Sprintf("\tError %d: %s\n", i, e.Error()) 
    } 

    return err 
} 

与えられたerrorをスライスに追加するコレクション機能を提供します。 Error() stringを呼び出すと、スライスを反復処理し、連結されたエラー文字列を作成します。

func main() { 
    collector := new(ErrorCollector) 

    for i := 0; i < 10; i++ { 
     collector.Collect(errors.New(fmt.Sprintf("%d Error", i))) 
    } 

    fmt.Println(collector) 
} 

より詳細にエラーが上に行く素晴らしいgolang.org blog postがあります。この例の完全な例はThe Go Playgroundです。

+0

ありがとう、あなたの例は非常に便利だった。私はこれを試して戻ってきます。 –

2

https://github.com/hashicorp/go-multierror「エラーのリストを単一のエラーとして表示するためのGo(ゴーラン)パッケージ」として自分自身を記述している人もいます。

関連する問題