4

大量の入力ファイルを反復処理して多くの解析と計算を行い、他のいくつかのファイルを出力する複雑なプログラムがあります。

void ParseFiles(string[] files, ProcessingDescription description) {
  foreach(string file in files) {
    try {
      DoComplicatedProcessing(file, description);
    }
    catch(Exception e) {
      LogFailure(file, e);
    }
  }
  DisplayResult();
}

System.Exceptionこの場合にキャッチする理由は、解析/計算のバグ、入力ファイルの不正な値、必要なすべてのデータが収まると仮定した場合のメモリ不足エラーでさえも許可の問題など、さまざまな理由で失敗する可能性があるためです。メモリ内はfalseであることが判明しました。

しかし、結局、なぜ失敗したのかは気にしません。プログラムが特定のファイルで失敗した場合は、その失敗をログに記録して、次のファイルに進みます。

セッションの終わりに、ユーザーが戻ってきて、どのファイルが失敗し、どのエラーメッセージがスローされたかを確認できます。多くの場合、エラーメッセージはユーザーの役に立たないかもしれませんが、最初の不良ファイルでプログラムがクラッシュするよりはましです。

「System.Exceptionをキャッチしない」と聞き続けますが、これを行う他の方法は実際にはわかりません。

4

5 に答える 5

3

処理できる例外のみをキャッチする必要があります。この場合、任意の例外を処理できるため、このコードに問題はありません。

于 2012-07-16T15:45:20.813 に答える
2

個人的には、これに問題はないと思います。あなたは問題について明確に考えており、適切な解決策を持っています。ソフトウェア開発で誰かが「絶対に…」と言うときはいつでも、通常、その逆の状況があります。だからこそ、「…をするのがベストプラクティス」「通常は…」などと言う人もいると思います。:)

キャッチExceptionすることで例外の粒度が失われ、奇妙なエッジ ケース (メモリなど) に遭遇する可能性があることを認識している場合は、リスクを負うかどうかはあなた次第です。

于 2012-07-16T15:44:41.180 に答える
2

これは、問題空間で必要なこと達成するため、例外をキャッチすることが理にかなっている完全に合理的なケースのように思えます。私は、「これをしてはいけません、常にあれをしてください...」のような普遍的なルールに非常に慎重になります。これらのルールに少し柔軟性と常識があると、確かに役に立ちます。あなたのコードは問題ないと思います。

于 2012-07-16T15:46:33.353 に答える
1

一般に、パフォーマンスのオーバーヘッドが発生するため、(アプリケーションの処理が強制的に停止されない限り) 例外をスローしないことを好みます。このMSDN の記事では、概要を説明しています。

処理の複雑さに基づいて、失敗のみをログに記録したいので、可能な限り「健全性チェック」を追加することを検討します。このようなもの:

void ParseFiles(string[] files, ProcessingDescription description) {
  foreach(string file in files) {
    if(!file.IsValid()) { //uses an extension method
      LogFailure(file, "Your Message"); //use the appropriate API
      continue;
    }

    try {    
      DoComplicatedProcessing(file, description);
    }
    catch(Exception e) {
      LogFailure(file, e);
    }
  }
  DisplayResult();
}
于 2012-07-16T15:52:04.700 に答える
1

解決しようとしている問題を解決するための要件を満たすことは、アプリケーションにとって良い形であり、現在の方法でそれを行うことが適切で機能的に正しい場合は、それを実行してください。

絶対は文脈を無視し、ベストプラクティスのようなものはありません - 「私たちの文脈のためのこの期間のベストプラクティス」だけです。

于 2012-07-16T15:52:04.770 に答える