2009-07-14 6 views
1

次のようにIは、未処理の例外が捕捉され、メッセージボックスを表示ThreadExceptionHandler有する試験リサイズアプリを持っている:ThreadExceptionHandlerはMainFrmコンストラクタで例外をキャッチしない

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    MessageBox.Show("error caught"); 
} 

Iは、フォームのctorの誤差を強制する場合次のように1(例えばDIVIDEBYZERO):

public Form1() 
{ 
    InitializeComponent(); 

    int i = 0; 
    int x = 5/i; 
} 

と(Windows 7の)のVisual Studioの外部でアプリケーションを実行し、ゼロ例外によって除算をが取り扱われていない - 私は助けにならない「WindowsFormApplicaを取得します1の動作が停止しました...」というメッセージが表示されます。

ただし、、dividebyzero例外をForm1_Loadイベントに移動して再実行すると、例外が適切に処理されます。

これがなぜこのように説明できますか?このテストプログラムを実行したのは、私が追跡しようとしている別のエンタープライズアプリケーションで同様の未処理例外の問題が発生しているためです。

答えて

4

これはおそらく、Application.Run()が呼び出される前にコンストラクタが実行されているためです。あなたのコードは、

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Form1 MyForm = new Form1(); 
    Application.Run(MyForm); 
} 

あなたのスレッド例外ハンドラのみApplication.Run()が実行されたときにアクティブになるように書くことができます。フォームコンストラクタで例外をキャッチするには、Form1 MyForm = new Form1();の魔法使いをtry/catchブロックで囲む必要があります。

+0

+1 - わかりやすく説明が... –

3

コンストラクタでは、スレッドコードではなくエラーがスローされています。あなたのコード:

Application.Run(new Form1()); 

Application.Run()を呼び出す前に、コードのその非常にライン上で、右クリックし、そこに例外をスローするつもりですので、スレッドコードでも実行を開始しません。

1

ThreadExceptionは例外を処理します。UIスレッド例外。 UnhandledExceptionは、UI以外のスレッド例外を処理します。

あなたは)(自分のメインに次の行を追加する必要があります。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

とあなたのクラスに次の:

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show("error caught 2"); 
} 
0

Application.ThreadExceptionイベントは、毎回アプリケーションが例外をスローと呼ばれていますあなたの例では、例外はメインスレッドでスローされますが、try catchブロックを追加することができます。

関連する問題