4

私はこのブログ投稿を読んでいますが、関数から返してそれらの外部で処理できるカスタムエラーを取得するために何をすべきかを正確に知っているとはまだ確信していません.

これは私が現在やっていることです:

func doSomething() int {
    x := 0
    // Do something with x.
    ...
    if somethingBadHappened {
        return -1
    }
    if somethingElseBadHappened {
        return -2
    }
    return x
}

これは私がやりたいことです:

func doSomething() int, ? {
    ...
    if somethingBadHappened {
        return ?, err
    }
    if somethingElseBadHappened {
        return ?, err2
    }
    return x, nil
}

しかし、これらの疑問符をどのように、また何に置き換えるかは正確にはわかりません。

4

2 に答える 2

4

私は変わります

func doSomething() int, ? {
        ...
        if somethingBadHappened {
                return ?, err
        }

        if somethingElseBadHappened {
                return ?, err2
        }

        return x, nil
}

の中へ

func doSomething() (r int, err error) {

        ...

        if somethingBadHappened {
                err  = err1 // Whatever satisfies the `error` interface
                return
        }

        if somethingElseBadHappened {
                err = err2 // dtto
                return
        }

        return x, nil
}

IOW、呼び出しサイトでは、err != nil の場合、他の戻り値を無視する、使用しない、または依存しないのが慣用的*であるため、r上記に中間値が割り当てられているかどうかは気にしません。

(*) 特に明記しない限り、最初の概算値。たとえば、と有効なデータの両方を同時に返すことができるio.Readerと明示的に宣言します。err == io.EOF

Read は、n > 0 バイトの読み取りに成功した後でエラーまたはファイルの終わりの状態に遭遇すると、読み取ったバイト数を返します。同じ呼び出しから (非 nil) エラーを返すか、後続の呼び出しからエラー (および n == 0) を返す場合があります。この一般的なケースの例として、入力ストリームの最後でゼロ以外のバイト数を返す Reader が err == EOF または err == nil を返すことがあります。次の読み取りは、関係なく 0、EOF を返す必要があります。

于 2013-03-17T15:31:09.583 に答える