例外がキャッチされない場合、C#プログラムで何が起こるか。プログラムは実行時エラーのようなもので「クラッシュ」しますか?
5 に答える
例外がキャッチされない場合、C#プログラムで何が起こるか。プログラムは実行時エラーのようなもので「クラッシュ」しますか?
多分。
そうでないかもしれない。
何が起こるかは実装定義です。
たとえば、「未処理の例外があり、Visual Studioがインストールされているようです。デバッガーを起動してプログラムの状態を調べますか?」というダイアログボックスが表示される場合があります。
「未処理の例外がありました。これをMicrosoftに報告しますか?」というダイアログボックスが表示される場合があります。
すでにデバッガーで実行している場合、デバッガーはおそらくそれを注意を引くために何かをします。
ランタイムはそれが望むことを何でもすることができます、そしてそれはあなたに何をすべきかを尋ねることを含みます。
ランタイムは、finallyブロックが実行される前にcatchブロックが発生するかどうかを認識していることに注意してください。これは、コンソールアプリで簡単に実証できます。クラッシュし、finallyブロックに出力するアプリを作成します。
Unhandled Exception: System.Exception: Exception of type
'System.Exception' was thrown at
ConsoleApplication1.Program.Main(String[] args)
finally running now
何が起こるかわかりますか?ランタイムは、finallyブロックを実行する前に、エラーを報告したり、デバッガーに実行の機会を与えたり、Microsoftなどに問題を報告したりします。それらが実行された場合。彼らはそうではないかもしれません。 何でも起こり得ます。ユーザーは、プロセスを破棄するか、デバッガーを起動して例外を修正するかなどを決定できます。
C#で例外がどのように機能するかを本当に理解したい場合は、次をお読みください。
http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx
はい。
はい。
何か「例外的な」ことが発生し、プログラムはそれを処理する方法を知らないため、その時点で実行を停止して「クラッシュ」する必要があります。クラッシュ後に実行されるコード(finallyブロックなど)がありますが、基本的にはコードのパーティは終了しています。
最善の方法は、これらのイベントをログに記録し、クラッシュ時のシステム/プログラムの状態についてできるだけ多くの情報を提供することです。Logging Application Blockは、エラーをログに記録するためのより堅牢な自動方法の1つです。
それを試してみてください!エラーにもよりますが、通常はキャッチします。さて、すべての例外をキャッチする必要がありますが、大きすぎるとa[i]
エラーがスローされる可能性があるが、それが範囲内に保持されるはずであることがわかっている場合(たとえば、forループ内)、キャッチしません。その例外。i
i
ただし、ユーザー(たとえば、GUI)からのデータを使用している場合は、ほとんどの場合、それを検証します。
自分で試してみてください!
class Program
{
static void Main(string[] args)
{
int[] arr = new int[1];
arr[5] = 6; //throws an exception; what kind?
}
}
これをコンパイルしてデバッグモードで実行すると、質問にすばやく答えることができます。
または、いくつかのプログラムを作成します。遅かれ早かれ、コードは例外をスローします。それは私たち全員に起こり、通常は数え切れないほどの回数です。コンソールまたはWinFormsアプリケーションでは、未処理の例外は通常、プログラムをクラッシュさせます。ASP.NETでは、エラーページが生成されますが、Webサイト全体がクラッシュすることはありません。未処理の例外が発生した場合の対処方法を指定するカスタムコードを記述して、アプリケーションが正常に失敗するようにすることもできます。