0

私はこのようなコードを持っています:

try {
    if (!(oc.State == ConnectionState.Open)) {
        oc.Open();
    }
    query = "SELECT DUCKBILL FROM PLATYPUS";
    da = new OracleDataAdapter();
    oCommand = new OracleCommand(query, oc);
    oCommand.Parameters.Add("ABCid", platypusABCID);
    da.SelectCommand = oCommand;
    dt = new OracleDataTable();
    da.Fill(dt);
    return dt;
} catch (OracleException e) {
    log.Error(e, e);
    //return dt; //use of unassigned local variable 'dt'
}
//return dt; //use of unassigned local variable 'dt'

... 「すべてのコードパスが値を返すわけではない」または(コメントされているように)「割り当てられていないローカル変数「dt」の使用」のいずれかで停止します

try..catchを取り除くことはできますが、これはデータベース操作であるため、結果のerrmsgをログに記録できるようにしたいと思います。どうすれば例外処理を維持し、不平を和らげることができますか?私は知っています、それは慈悲深い不平ですが、それでも...

4

5 に答える 5

3

新しいテーブルまたは null を事前に割り当てます。

OracleDataTable dt = null;

また

var dt = new OracleDataTable();

その後:

try
{
    ...
}
catch
{
    ...
}

return dt; // Will return null.

新しいテーブルを割り当てると、例外が発生した場合に空のテーブルが返されます。

状況を考慮して、論理的にどちらを好むかを選択してください。

于 2012-05-15T20:42:00.943 に答える
2

私は例外を再スローします:

} catch (OracleException e) {
    log.Error(e, e);
    throw;
}

例外をログに記録するだけでは、例外が実際に「処理」される (そして、プログラム フローが問題なく楽しく続行できるようになる) 可能性はほとんどないため、通常は、例外をバブルアップさせる方が適切です。

于 2012-05-15T20:42:30.740 に答える
1

新しいテーブルに設定するだけでfinally、例外がスローされたかどうかに関係なく実行されるため、ブロックに返されます。

OracleDataTable dt = new OracleDataTable();

try
{
    //your code
}
catch (OracleException ex)
{
    //your code
}
finally
{
    return dt;
}
于 2012-05-15T20:44:00.020 に答える
1

コードを呼び出すためのより多くの価値がある例外でデータベース例外をラップすることをお勧めします。

try {
    if (!(oc.State == ConnectionState.Open)) {
        oc.Open();
    }
    query = "SELECT DUCKBILL FROM PLATYPUS";
    da = new OracleDataAdapter();
    oCommand = new OracleCommand(query, oc);
    oCommand.Parameters.Add("ABCid", platypusABCID);
    da.SelectCommand = oCommand;
    dt = new OracleDataTable();
    da.Fill(dt);
    return dt;
} catch (OracleException e) {
    throw new MyDataLayerException("Cannot retrieve duckbill", e);   
}

この場合、呼び出し元のコードは の戻り値を強制的にチェックする必要はありません。null例外が発生した場合は、すべてのコンテキスト情報とともにスタックの上位にログを記録します。

于 2012-05-15T21:03:05.087 に答える
1

The compiler is quite obviously correct in complaining that "not all code paths return a value". A non-void method needs to either (a) return a value, or (b) throw an exception.

Your code currently does neither when the DB operation fails: You are catching the exception, but you're neither re-throwing it to the caller, nor are you returning a value from inside the catch block.

What should your method return in the case of an error condition?

あなたはこれを決めなければなりません。賢明な解決策はたくさんあるので、誰もあなたに正しい答えを教えることはできません。例えば:

  • 戻るべきnullですか?

    その場合は、エラーをログに記録した後return null;、ブロック内から。catch

  • 空のテーブルを返す必要がありますか?

    続いてブロックreturn new OracleDataTable();の中から。catch

  • それとも、何も返さないのでしょうか?

    次にthrow;、例外をログに記録した後、catch ブロック内で再度例外を記録します。

(メソッドのコントラクトを明確に定義すると役立つ場合があります。たとえば、メソッドが呼び出し元のコードに対してどのような種類の保証を行うかを考えてください。)

于 2012-05-15T21:07:50.730 に答える