2011-01-25 15 views
1

Exceptionがスローされると、処理されるまで(try/catchブロック内で)コールスタックがバブルアップし、これが起こらないと例外は最終的にはProgram.Main()に到達し、それでも処理されない場合はランタイムによって「未処理の例外」とみなされます。例外処理の説明

これは間違いありませんか?私は高低を検索しており、これに同意する情報は見つかりませんでしたか?私が言ったことの何らかの不正確さ?

答えて

7

その例外がスローされたとき、それは(try/catchブロック内)に処理されるまで、それはバブルアップコールスタックをすることが私の理解と、この場合は決して例外は最終的にはProgram.Main()に到達し、それでも処理されない場合は実行時に「未処理の例外」とみなされます。

あなたの説明は、それ自体が不正確ではありませんが、非常に不完全です。最後の二つのCLR機能はC#言語で公開されていないことをフィルタ

注意と

  • finallyブロック
  • 障害ブロック
  • catchブロック:あなたが例のために何が起こるかについては説明しません。しかし、彼らはまだ存在しています。

    これらの3つのケースと通常のキャッチブロックの制御フローはかなり複雑になります。

    あなたは、これがどのように動作するかのより完全な理解をしたい場合は、私は、件名にクリストファーBrummeの詳細な記事の徹底と密接な読書をお勧めします。

    http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

2

はい、正しいです。それが例外処理が重要な理由です。

例外について読むのは興味深い何か:http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

+0

この情報へのあなたの知る限りでは、 –

+0

私が知っている最良の情報源はCLIの仕様です。読書に少し乾いた。 http://www.ecma-international.org/publications/standards/Ecma-335.htm – Botz3000

+2

これは間違っています。それは例外処理が重要な理由ではありません。あなたは何もできない例外を処理すべきではありません。ほとんどの場合、例外について何かできることがあれば、それはフロー制御のために使用していることを示しています。これは最初にやってはならないことです。例外は本当に*例外的な条件のために予約する必要があります。*処理できない可能性があります*必要があればプログラムをクラッシュさせてしまう* –

2

そのことを除き、私の理解それが処理されるまで(try/catchブロック内で)コールスタックをバブルさせます。もしこれが起こらなければ、例外は最終的にはProgram.Main()に到達し、まだ処理されない場合は例外とみなされます。ランタイムによって「未処理の例外」が発生しました。 finallyブロックがスローした場合catchブロック内で例外を処理することに加え

、例外が

  • (停電などのようなものを除くと)、次の条件の下でProgram.Main()に到達しないだろう例外が発生した場合、元の例外はもはや伝播されません。
  • 例外がメインスレッド以外のスレッドによってスローされた場合、Program.Main()に達することなく「未処理例外」になります。 (新しいバージョンの.NETランタイムで)