3

私は次のパターンを持っています:

private void MyFunction()
{
    doStuff();

    if (problem())
    {
        cleanup();
        return;
    }

    doMoreStuff();

    if (otherProblem())
    {
        cleanup();
        return;
    }

    doYetMoreStuff();
}

エラー クリーンアップ コードが重複しています。これを排除する明白な方法は次のとおりです。

private void MyFunction()
{
    try {
        doStuff();

        if (problem()) throw new MyException();

        doMoreStuff();

        if (otherProblem()) throw new MyException();

        doYetMoreStuff();
    }
    catch (MyException)
    {
        cleanup();
        return;
    }
}

ただし、エラー ケースは実際には例外的なものではありません。これは ASP.Net ページであり、クエリ文字列にデータが含まれていない場合やデータがない場合にエラー ケースが発生します。例外は、エラー処理を重複排除してメイン コードから分離する最も明白な方法のようですが、私が理解しているように、受け入れられているベスト プラクティスは、このような制御フローに例外を使用しないことです。

これを行う慣習的な方法は何ですか?

4

5 に答える 5

3

例外ではない状況で例外を使用することは、特に例外がスローされて同じメソッドでキャッチされる場合には、良い考えではありません。finallyより良いアプローチは、クリーンアップの必要性を示すブール変数を使用し、ブロック内でクリーンアップを実行することです。

var needsCleanup = true;
try {
    doStuff();

    if (problem()) return;

    doMoreStuff();

    if (otherProblem()) return;

    doYetMoreStuff();

    needsCleanup = false;
} finally {
    if (needsCleanup) {
        cleanup;
    }
}
于 2012-07-05T13:38:24.123 に答える
1

finally実行がブロックを離れるときはいつでも、ブロックを離れる理由が を呼び出すtryためであっても、ブロックが実行されます。したがって、次のようなことができます。tryreturn

private void MyFunction()
{
    try
    {
        doStuff();
        if (problem()) return;

        doMoreStuff();
        if (otherProblem()) return;

        doYetMoreStuff();
    }
    finally
    {
        cleanup();
    }
}
于 2012-07-05T13:40:44.110 に答える
0

Ifは、複製されcleanup()ていないよりも、本当に単なるメソッド呼び出しです。

この場合、例外は使用しません。通常のフローで例外を使用することが悪い考えである理由を詳細に説明している記事を簡単にグーグルで検索できます。

于 2012-07-05T13:37:05.003 に答える