2011-01-07 5 views
12

私は、一般的なプログラミングで何が良いか、より速いのかを知りたいですか?例外を避けるか、例外を待つか?より良い/より速いのは何ですか? try-catchまたは例外を避ける?

避け例外は次のようになります。できれば

string a = null; 
list = someMethod(); 
if(list.Length > 0){ 
    a = list[0]; 
} 
if(a!=null) ... 

またはキャッチ例外を試してみてください...

string a = null; 
try{ 
    a = someMethod()[0]; 
catch{} 
if(a!=null) ... 
+1

単語「速く」をキャンセルします。無関係です。そして、あなたがCLRを動かすようなものなので、try-catchを使うのは正しい方法でもありません。 – BoltClock

+0

ほんの一例の男... – carlosdubusm

+1

@BoltClock、そうではありません。例外が発生した場合。遅いです。 – CaffGeek

答えて

18

パフォーマンスは、ここで最も関連性の高い問題ではありません。問題は、どちらが読みやすい/保守可能な/テスト可能なプログラムにつながるかです。後でパフォーマンスについて心配することはできます。

一般に、フロー制御の例外は使用しないでください。彼らは事実上非ローカルのgotoであり、プログラムを読みやすく、フォローするのが難しくなります。したがって、例外的な状況のために予約する必要があります。フロー制御のためにブロックtry-catchを使用しないで逃げることができたら、しないでください。あなたのプログラムはより読みやすく保守的です。

この状況に対処するための「正しい」方法はsomeMethodからの戻り値がある保証契約(Contract.Ensures)がある場合

var list = someMethod(); 
if(list == null || list.Length == 0) { 
    // handle something bad 
} 
string a = list[0]; 
if(a != null) { 
    // go 
} 

あなたはlistがnullや空ではないではないことをチェックを回避することができていますnullでなく、空でもありません。

ただし、例外はローカルに高価です。それらがプログラムのパフォーマンスに影響を与えるかどうか(つまりボトルネック)は別の質問です。しかし、例外は一般的にボトルネックではありません(アプリケーションがクラッシュするとパフォーマンスが気になる人はいませんか?)

+0

ええ、答えをありがとう、私は試して空のキャッチで何かが正しくないことを知っていた。より多くのプログラムを維持することは非常に真実です。たぶん、予期しない別の例外が発生する可能性があります。たぶん空のキャッチは、あなたが何か例外が発生してもプログラムを実行し続けたいと思っても気にしないと意味があります。 – carlosdubusm

+1

@carlosdumusm:あなたはこれを正しく理解しているようですが、すべての例外をキャッチする空の 'catch'ブロックまたは' catch'ブロックが(bad、Bad、悪い。どんなタイプの例外がスローされるかもしれないが、あなたはそれらのすべてを扱うことができると宣言しています。物事が悪い状態にあるときに、あなたがすべての例外を "処理している"ために悪い状態や悪い状態がどれほど悪いかわからないときは、何も起こらないかのように続行することは潜在的に非常に危険です。あなたが処理できると知っていることを処理し、そうでなければ速く失敗する。 – jason

+0

ええ、意味が分かりますが、私は数年のプログラミングをしていますが、例外についての知識はほとんどなく、時にはどこで試合をするか、投げる場所がわからないことがあります。ありがとう。 – carlosdubusm

1

は常に常に常に例外を回避します。

例外は例外的である必要があります。

あなたがそれを予測できる場合は、それが起こるのを防ぐ。そのような空のcatchブロックを使用し

人々は

それはcatchブロックに入らないためにも高速です...コンピュータを使用してから禁止されなければなりません。

7

例外は高価です - 例外をテストして回避することができます。

通常のプログラムフローでは例外を使用しないでください。

+0

ええ、例外の費用について考えたことはありません、ありがとうございます。 – carlosdubusm

0

例外をスローするのは高価な作業なので、私はいつもキャッチするのではなく検証します。

これは、各実行時に例外がスローされるいくつかのコードをテストして生成し、条件付きチェックを行い、パフォーマンスを測定する同様のコードセットに対してテストするのは簡単です。

例外条件がスローされる詳細に関するコードが文書化されている場合は、呼び出しコードを変更できる必要があります。もちろん、すべてのシナリオ(低レベルのランタイムエラーはおそらく?)を処理することはできません。したがって、実際に反応し続ける可能性のある例外を処理して例外を処理するだけです。

2

です。 私はほとんど例外を避けようとしています。

0

例外は例外がない限り(例外がない限り)使用する必要があるため、対処が必要な非常に珍しいことがある場合にのみtry/catchを使用してください(エラーメッセージをポップアップ)。

また、try/catchは、プログラマーに何らかの外部エラーが発生する可能性があり、対処する必要があることを知らせるシグナルです。あなたの例では、listがヌルであることは、単にプログラムの実行/制御フローの通常の部分であるため、例外的なことは何もありません。

また、空のキャッチオールは、(必要な状況は限られていますが)とにかく、一般的には悪いことです。例外について何もしていない理由を説明するには、確かにコメントが必要です。

あなたはすべての入力のための長さを毎回チェックしているので回避は、より高価で、厄介な例外に関するuseful blog postは、あなたが重要なNランタイムで命令/パフォーマンスの観点の数から

1

純粋に役立つかもしれませんあります。例外を除いて、catchブランチは、その事実に基づいてのみ実行されます。

+3

しかしそれが起こるとSLOWERです。他の潜在的なエラーをマスクします。そして、それは恐ろしいプログラミングの練習です。 – CaffGeek

+1

通常のフローでは、Try-Catchはオーバーヘッドが全く発生しません。この例で使用されているテストとジャンプは、処理時間に関してかなり安いようです。 – Derrick

+0

あなたが言ったように、他のプログラミングエラーをマスクするのは、空の 'catch {}'のときは恐ろしいプログラミングです。上記のように、例外は例外的な条件で使用するもので、日常的に起こるものではありません(例:リストが常に初期化時にnullになり、頻繁にヒットすることが予想される場合は例外ではなくなります。それのための)。 – Aphex

2

もちろん例外を避けてください。

関連する問題