1

次のような状況があるとします。

statement 1;
statement 2;
statement 3;
statement 4;
statement 5;
statement 6;
statement 7;
statement 8;
statement 9;
statement 10;

これらのステートメントのいずれかが。を発生させる疑いがありExceptionます。だから私はそれらをtry-catchブロックに入れました。

try{
    statement 1;
    statement 2;
    statement 3;
    statement 4;
    statement 5;
    statement 6;
    statement 7;
    statement 8;
    statement 9;
    statement 10;
}catch(Exception e){
    e.printStackTrace();
}

ここで、計算を完了するために、何があっても、これらの10個のステートメントすべてを処理する必要があります。どうすれば状況に対処できますか?

たとえば、10String秒あるとします。NullPointerExceptionユーザーがフィールドを空白のままにすることを決定した場合、それらのいずれかがをスローする可能性があります(たとえば、フォームに適用できない場合など)。プロジェクト全体を開発する場合は、最初にとをチェックして、nullそれに応じて値を返し、処理することができます。しかし、データを処理するためにこのモジュールを開発するだけでよいと仮定します。

個々のifチェックを入れて、どれStringがnullであるかをチェックし、処理でその値を無視して、次に進むことができます。しかし、私がsのn数を持っている場合、ステートメントをString導入することは整然とはなりません。n ifそれでしょうか?

個人がいて、発生しtry catchても処理を続けることができました。Exceptionしかし、繰り返しになりますが、整頓されていません。

スタックトレースを分析して行番号を取得し、次の行にジャンプして処理を再開できます(できますか?わかりません。キャッチから試行に戻りますか?不可能ですが、それでも可能性としてこれを書き留めました)。

しかし、これらの方法は適切で正しくないようです。

そのような状況を処理するためのより良い、より簡単な方法はありますか?例を挙げたところですがString、処理されるデータは何でもかまいませんし、何でも生成できますException

もう一度質問を繰り返します。メソッドまたはプロセスで生成された例外の数に関係なく、メソッドまたはプロセスの評価を完了する方法はありますか?

質問は重複している可能性があります(ただし、見つかりませんでした)、または適切に表現されていない可能性があります。自由に編集(または編集を提案)してください。ただし、主要なアイデアに焦点を合わせたままにしてください。

4

3 に答える 3

4

どの文字列がnullであるかをチェックし、処理でその値を無視して先に進むために、個別のifチェックを行うことができます。しかし、文字列の数がn個ある場合、n個のifステートメントを導入すると整頓されません。それでしょうか?

各文字列で同じことをしているのなら、「チェックしてオプションで何かをする」動作をメソッドに抽出する必要があります。

正当にnullになる可能性があることがわかっているnull参照でメソッドを呼び出すべきではありません。常にどこかにバグがあることを示す必要があります(null参照が与えられていないか、それが正当な場合は、何かを行う前にチェックする必要があります)。NullPointerException

メソッドが10の別々のことを実行していて、それぞれが失敗する可能性がある場合、最初は大きすぎる可能性があります。それらは独立した操作のように聞こえます(そうでなければ、操作1が失敗した後、操作2を実行できませんでした)ので、それぞれをtry / catchブロックを使用して別々のメソッドに入れ、トップレベルのメソッドから呼び出します。

基本的に、これはコードの臭いのように感じますが、例外に直面して一連の手順を簡単に続行することはめったにExceptionありません。ほとんどの場合、キャッチするだけではありません。これが本当にあなたが望むデザインであるかどうかについて慎重に考える必要があります。

これを簡単にする言語には間違いなく何もありません-それはほとんどの場合間違ったことだからです。

于 2012-06-23T08:17:41.653 に答える
3

たぶん、文字列/ステートメントを配列内に配置し、TryCatchブロックを配列要素をループするループ内に配置することができます。

このようなもの:

for (Statement statement: statements) {
  try{
    statement;
  }catch(Exception e){
    e.printStackTrace();
  }
}
于 2012-06-23T08:27:47.623 に答える
2

私は、これがコードの臭いである(単一責任の原則に違反している)ことについてJonSkeetが言ったことを2番目に述べました。たす:

データ検証でこれらの例外を防ぐことができる場合は、汎用バリデーター(またはタイプに基づく)を作成し、アクションを実行する前にバリデーターを呼び出すこともできます(データ検証が成功した場合にのみアクションを実行します)。

この設定では、私の仮定が正しいことを考慮して、検証が失敗したときに何かをログに記録し、これらの10個のステートメントすべてをループで実行することもできます(コードパスは類似しているため)

foreach (var statement in statements)
{
       if (statement.IsDataValid()) 
       {
           statement.Execute();
       }
       else
       {
           // Log stuff or handle appropriately
       }
}

私はあなたのコードやデータについてあまり多くの情報を持っていないので、ただ指示を与えるだけです。

于 2012-06-23T08:27:01.043 に答える