2009-08-26 20 views
6

は、私はちょうどプロジェクトで見つかった:.NETのフロー制御にtry-catchを使用するのは「悪い」ですか?

try 
{ 
    myLabel.Text = school.SchoolName; 
} 
catch 
{ 
    myPanel.Visible = false; 
} 

は、私がnull例外を発生することは事実上のコンピュータになるだろう(schoolは理論的には、nullでないmyLabel可能性があるため)と言って、これを書いたよりも、開発者に話をしたいbeep three times and sleep for two seconds 。しかし、私はそれについてのルールを誤解しているのだろうかと思います。明らかに、これはtry/catchの意図された使用ではありませんが、パフォーマンス上の理由から意図を無視するために悪いですか?私はそれがちょうど悪いように感じるが、私は "それは本当に悪い"以上のことを言いたい。

+0

http://stackoverflow.com/questions/77127/when-to-throw-an-exception/77164#77164 – grenade

答えて

17

制御フローに例外を使用しないでください。単に設計が不良であるためです。それは意味をなさない。例外は例外的なケースであり、通常のフローではありません。現代のハードウェア上の最新のアプリケーションでは、一日中例外を投げてしまい、ユーザーがパフォーマンスに気づかないことがあるため、パフォーマンスはおそらくこのような状況では問題にならないでしょう。しかし、これが大量のデータを処理したり、何らかの作業を行う高性能アプリケーションであれば、パフォーマンスは問題になります。

8

私はこれが例外に対するコーディングであり、また不要なオーバーヘッドを継承するので、これは悪いと思います。例外は、特定の方法で処理される場合にのみ捕捉されるべきです。

例外があると予測できない場合は例外です。この場合は、学校がヌルになるかどうかを確認する簡単なチェックです。実際に学校がヌルになる可能性があります(ラベルが設定されているため何もない)。学校がnullであり、それがそれ自身のArgumentNullExceptionをスローするべきではないはずです。

+0

NULLではなく空の文字列にする必要があります。 –

+0

@BillyONeal、学校はこの場合は例外が発生する場所である可能性があるオブジェクトです。 –

1

フロー制御に例外を使用することは決してありません。例外は高価であり、コード内の他の場所に到達するために例外がスローされたプログラムの実際のフローが何であるかを判断することは困難です。私にとってこれはGoToのようなものです。これは例外を避けるべきではないという意味ではなく、むしろプログラム内で通常どんなことが起こるべきかの例外である例外でなければなりません。

私は、コードの悪い部分は例外で何もしていないということです。例外がスローされている理由についてのログや説明はありません。

+0

.NETでは、スタックトレースを取得していない限り例外はそれほど高額ではありません。この特定のシナリオでは、この例外処理がパフォーマンスの問題を引き起こしたことを示すのは難しいでしょう。 –

+0

物事の大きな範囲では、それほど高価ではありませんが、if(null == myLabel)と比較されます。 – kemiller2002

2

これは悪いことは絶対に正しいです。性能を傷つけるので、意思に反して悪いです。です。

さまざまなプログラミングスタイルの余地があることを認識していますが、個人的には、これが機能してもコードが何をしようとしているのかを見ることができ、読みやすさとコードの明瞭性が損なわれ、メンテナンスプログラマーが従うのが難しい。ここでif文がはるかに適切です。例外を投げる

2

は、パフォーマンスにマイナスの影響を持っている、http://msdn.microsoft.com/en-us/library/ms229009(VS.80).aspx

+2

私はあなたがそれについて技術的になったら、例外をキャッチするのは高価な部分だと思います。しかし、それは本当に重要ではない、パフォーマンスヒットはそこにある。 –

+0

これは私が実際に尋ねようとしていたものです。プログラミングに対する嫌悪、または例外を投げているわけではないので技術的には大丈夫です。 +1のコメント。 – dnord

2

例外は、実行時のオーバーヘッドが発生しませんが、それはここではおそらく無視できます参照してください。デバッガには違いがありますが、ビルドされたバイナリはほぼ同じ速度で動作するはずです。

チンパンバーは機械で読み取れるコードを作成できることをデベロッパーに伝えます。良いコードは機械ではなく人間のために書かれています。あなたが心配している唯一の例外がnull例外であれば、おそらくユーザのコードのバグでしょう。誰もそのように何もnullを割り当てようとするべきではありません。代わりにAssert()ステートメントを使用してください。私の意見で

+0

「いいコードはマシンではなく人間のために書かれた」ため、これを+6にすることができます。私は、ジュニア・プログラマーとシニア・プログラマーの間の違いがすべてそのステートメントであるという結論に達しました。 –

9

if文ではるかに明らかにされる可能性があるため、これは悪い:

if (school != null) { 
    myLabel.Text = school.SchoolName; 
} 
else { 
    myPanel.Visible = false; 
} 

確かに不必要に例外処理を使用しないよう、コードのは非常に明白な意味を作るということ。

1

「この例外を通常の制御フローとして使用しないのはなぜですか?」のpostを参照してください。

+0

私は朝の検索に多かれ少なかれ、リンクのおかげで、あなたのリンクが何であるか、それがなぜ関連性があるのか​​を少し説明してください。そうすれば他のユーザーも読むことができます。 他のユーザー:「制御の通常の流れとして例外を使用しないのはなぜですか?」と題された、よく評価されているSOの質問へのリンクです。 – dnord

0

私は皆ここに同意します - それは恐ろしい考えです。

Javaではいくつかのケースがあります(今はほとんどなくなっていると思いますが、外部ライブラリにはまだ残っているかもしれません)。特定の「例外ではない」ケースに対して例外をキャッチする必要があります。

一般に、ライブラリコード(実際にはどのクラスでも)を書くときは、避けることのできる何かの例外を使用しないでください。名前フィールドが設定されていない可能性があり、write()メソッドで例外が発生する可能性がある場合は、isValid()メソッドを追加して、実際に知っている書き込みの周りで例外をキャッチしてはいけません問題があります。

(悪いJavaコードの補遺):この「良い」プログラミングスタイルはJavaでのチェック例外を実質的に排除し、Javaでのチェック例外はSuckです。

関連する問題