キャッチブロックは、ロジックの記述、つまりフロー制御の処理などに使用する必要がありますか?それとも例外を投げるためだけですか?コードの効率や保守性に影響しますか?
キャッチブロックにロジックを記述した場合の副作用(ある場合)は何ですか?
編集:
Java SDKクラスで、catchブロック内にロジックが記述されています。たとえば、(Java.lang.Integer
クラス):
try {
result = Integer.valueOf(nm.substring(index), radix);
result = negative ? new Integer(-result.intValue()) : result;
} catch (NumberFormatException e) {
String constant = negative ? new String("-" + nm.substring(index))
: nm.substring(index);
result = Integer.valueOf(constant, radix);
}
EDIT2:
私は tutorial を実行していましたが、例外内に例外的なケースのロジックを記述する利点として数えられています。
例外を使用すると、コードのメインフローを記述し、他の場所での例外的なケースに対処できます。
catchブロックにロジックを記述する場合と記述しない場合の特定のガイドライン
あなたが引用する例は、不十分なAPI設計によるものです(文字列が解析して例外をキャッチすることを除いて、文字列が有効な整数であるかどうかを確認する明確な方法はありません)。
技術レベルでは、throwとtry/catchは制御フロー構造ですを使用すると、コールスタックをジャンプすることができます。呼び出しスタックを上にジャンプすると、ソース内で近接していないコードが暗黙的に接続されます。これは保守性が悪いです。したがって、それを実行する必要があり、代替手段がさらに悪い場合にのみ使用してください。 代替案の方が悪い場合に広く受け入れられているケースはエラー処理です(手動で呼び出しスタックの各レベルを確認して渡す必要がある特別な戻りコード)。
代替案の方が悪いケースがある場合(そして、それらすべてを本当に慎重に検討した場合)、私はそう言います制御フローにthrowとtry/catchを使用するのは問題ありません。ドグマは判断の代わりにはなりません。
これは、言語とパラダイムに依存する傾向があるものです。
私の仕事のほとんどはJava(そして時にはC++)で行われます。例外は例外的な状況でのみ使用する傾向があります。スタックオーバーフローにはいくつか質問があります Java での例外のパフォーマンスオーバーヘッドについて、そしてご覧のように、それはまったく無視できるわけではありません。コードの可読性や保守性など、他の懸念事項もあります。適切に使用すると、例外エラー処理を適切なコンポーネントに委任できます。
しかし、Pythonでは、許可よりも許しを求めるほうが簡単であるという考えが支配しています。 Pythonコミュニティでは、これは [〜#〜] eafp [〜#〜] として知られています。 Cスタイル言語での「飛躍前のルック」( [〜#〜] lbyl [〜#〜] )アプローチとは対照的です。
これは、try/catchブロックについて考える最良の方法ではありません。 try/catchブロックについて考える方法は次のとおりです。障害が発生しました。この特定の障害を処理するのに最適な場所はどこですか。それは次のコード行かもしれません、それは呼び出しチェーンの20レベル上かもしれません。どこにいても、それは本来あるべき場所です。
Catchブロックが何をするかは、エラーとそれに対して何ができるかによって異なります。場合によっては単に無視できる(重要なデータが含まれていないスクラッチファイルを削除できない)、関数の戻り値をtrueまたはfalseに設定するために使用される(Javaのint parseメソッド)、プログラムを終了することもある。それはすべてエラーに依存します。
理解すべき重要な部分は次のとおりです。catch block ==私はこれに対処する方法を知っています。
Catchブロックは、例外の処理にのみ使用し、それ以外のものは使用せず、制御フローには使用しないでください。例外を使用してフローを管理する状況では、事前条件を確認することをお勧めします。
例外のあるフローの処理は遅く、意味的に正しくありません。
キャッチブロックは、ロジックの記述、つまりフロー制御の処理などに使用する必要がありますか?それとも例外を投げるためだけですか?コードの効率や保守性に影響しますか?
まず、「例外は例外的な状況で使用されるべきである」という概念を忘れてください。また、許容できないパフォーマンスのコードが得られ、問題がどこにあるのかを測定するまで、効率の心配をやめます。
コードは、アクションが条件なしで単純なシーケンスで続く場合を理解するのが最も簡単です。例外は、通常のフローからエラーチェックを削除することにより、保守性を向上させます。実行が通常のフローに従うかどうかは、99.9%の時間、50%の時間、20%の時間のいずれでもかまいません。
関数が値を返すことができない場合、プロシージャが期待されるアクションを完了できない場合、またはコンストラクターが使用可能なオブジェクトを生成できない場合は、例外をスローします。これにより、プログラマは関数が常に使用可能な結果を返し、プロシージャは常に要求されたアクションを完了し、構築されたオブジェクトは常に使用可能な状態であると想定できます。
例外処理コードで私が直面する最大の問題は、プログラマーがtry/catchブロックを作成するべきでないときに作成することです。たとえば、ほとんどのWebアプリケーションでは、データベース要求が例外をスローした場合、コントローラーで実行できることは何もありません。最高レベルの一般的なcatch句は1つで十分です。その後、コントローラコードは、ディスクがクラッシュしたり、データベースがオフラインになっているなどの可能性を無視できます。
Catchブロックは、コードロジックの記述には使用しないでください。エラーの処理にのみ使用してください。たとえば、(1)割り当てられたリソースをクリーンアップし、(2)有用なメッセージを出力し、(3)正常に終了します。
例外が悪用され、望ましくないgoto
効果が発生する可能性があるのは事実です。しかし、それはそれらを役に立たなくするわけではありません。 適切に使用される の場合、コードの多くの側面を改善できます。