Home All Groups Group Topic Archive Search About

Application.ThreadException not working

Author
15 Nov 2006 12:08 PM
joseph_gallagher
Hi,

I have a shoddily written application that is written in 1.1 that I've
ported to 2.0 and now occasionaly I get crashes which I suspect are
been caused by exceptions in threads, most likely due to trying to
access controls which is now stricter, I know I could just set

CheckForIllegalCrossThreadCalls = false;

But I'd rather like to understand a bit better about ways to handle
these exceptions and diagnose them so have been playing with
"Application.ThreadException" and
"AppDomain.CurrentDomain.UnhandledException", the problem I have is
"Application.ThreadException" never seems to fire and this is cunfusing
the hell out of me. I have the following simple test code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace TestApp {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            Application.ThreadException += new
ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new
UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }

        void CurrentDomain_UnhandledException(object sender,
UnhandledExceptionEventArgs e) {
            MessageBox.Show("CurrentDomain_UnhandledException " +
e.ExceptionObject.ToString());

        }

        void Application_ThreadException(object sender,
ThreadExceptionEventArgs e) {
            MessageBox.Show("Application_ThreadException");
        }

        private void exceptionButton_Click(object sender, EventArgs e)
{
            Thread t = new Thread(delegate() {
                int zero = 0;
                int x = 1 / zero;
            });
            t.IsBackground = true;
            t.Start();
        }

        private void crossThread_Click(object sender, EventArgs e) {
            Thread t = new Thread(delegate() {
                crossThread.Text = "Error";
            });
            t.IsBackground = true;
            t.Start();
        }
    }
}

Which is just a windows form that has 2 buttons, crossThreadButton &
exceptionButton, crossThreadButton simply creates a thread that tries
to access a control it shouldn't, and exceptionButton simply divides by
0 to create a exception, both cause the
"AppDomain.CurrentDomain.UnhandledException" event to be fired, but
niether cause the "Application.ThreadException" event to be fired which
is confusing me.

When should "Application.ThreadException" get called, am I missing a
setting or is it only for specific situations.

Also is there a way to prevent the application from exiting when there
is a exception in a thread and
"AppDomain.CurrentDomain.UnhandledException" is fired, In my main
shoddy app I'm 99.99% sure that exceptions in threads that have a long
lifetime are handled and that these problems are been caused in
shortlived threads that if they fail the work will simply be picked up
on the next iteration, there is a reasonable amount of manual work
involved in setting up and configuring the app and loosing all this is
a pain for the user, if they could be informed of the error but allowed
to continue that would be a lot easier for me while I find all the
causes of the problem.

Author
16 Nov 2006 11:01 AM
Ciaran O''Donnell
try calling:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);


Ciaran O'Donnell

Show quote
"joseph_gallag***@hotmail.com" wrote:

> Hi,
>
> I have a shoddily written application that is written in 1.1 that I've
> ported to 2.0 and now occasionaly I get crashes which I suspect are
> been caused by exceptions in threads, most likely due to trying to
> access controls which is now stricter, I know I could just set
>
> CheckForIllegalCrossThreadCalls = false;
>
> But I'd rather like to understand a bit better about ways to handle
> these exceptions and diagnose them so have been playing with
> "Application.ThreadException" and
> "AppDomain.CurrentDomain.UnhandledException", the problem I have is
> "Application.ThreadException" never seems to fire and this is cunfusing
> the hell out of me. I have the following simple test code
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Text;
> using System.Threading;
> using System.Windows.Forms;
>
> namespace TestApp {
>     public partial class Form1 : Form {
>         public Form1() {
>             InitializeComponent();
>             Application.ThreadException += new
> ThreadExceptionEventHandler(Application_ThreadException);
>             AppDomain.CurrentDomain.UnhandledException += new
> UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
>         }
>
>         void CurrentDomain_UnhandledException(object sender,
> UnhandledExceptionEventArgs e) {
>             MessageBox.Show("CurrentDomain_UnhandledException " +
> e.ExceptionObject.ToString());
>
>         }
>
>         void Application_ThreadException(object sender,
> ThreadExceptionEventArgs e) {
>             MessageBox.Show("Application_ThreadException");
>         }
>
>         private void exceptionButton_Click(object sender, EventArgs e)
> {
>             Thread t = new Thread(delegate() {
>                 int zero = 0;
>                 int x = 1 / zero;
>             });
>             t.IsBackground = true;
>             t.Start();
>         }
>
>         private void crossThread_Click(object sender, EventArgs e) {
>             Thread t = new Thread(delegate() {
>                 crossThread.Text = "Error";
>             });
>             t.IsBackground = true;
>             t.Start();
>         }
>     }
> }
>
> Which is just a windows form that has 2 buttons, crossThreadButton &
> exceptionButton, crossThreadButton simply creates a thread that tries
> to access a control it shouldn't, and exceptionButton simply divides by
> 0 to create a exception, both cause the
> "AppDomain.CurrentDomain.UnhandledException" event to be fired, but
> niether cause the "Application.ThreadException" event to be fired which
> is confusing me.
>
> When should "Application.ThreadException" get called, am I missing a
> setting or is it only for specific situations.
>
> Also is there a way to prevent the application from exiting when there
> is a exception in a thread and
> "AppDomain.CurrentDomain.UnhandledException" is fired, In my main
> shoddy app I'm 99.99% sure that exceptions in threads that have a long
> lifetime are handled and that these problems are been caused in
> shortlived threads that if they fail the work will simply be picked up
> on the next iteration, there is a reasonable amount of manual work
> involved in setting up and configuring the app and loosing all this is
> a pain for the user, if they could be informed of the error but allowed
> to continue that would be a lot easier for me while I find all the
> causes of the problem.
>
>
Author
19 Nov 2006 2:26 PM
joseph_gallagher
Tried that, does nothing
Author
19 Nov 2006 3:27 PM
David Levine
You are subscribing to the events in the .ctor of the form itself. You need
to subscribe to them before the Form is created, like in your Main, or
anywhere before the form itself is created.

The reason has to do with the way  the Forms class wraps the window
procedure with its own try-catch and then decides whether or not to handle
the exception.


<joseph_gallag***@hotmail.com> wrote in message
Show quote
news:1163592480.983395.172350@h54g2000cwb.googlegroups.com...
> Hi,
>
> I have a shoddily written application that is written in 1.1 that I've
> ported to 2.0 and now occasionaly I get crashes which I suspect are
> been caused by exceptions in threads, most likely due to trying to
> access controls which is now stricter, I know I could just set
>
> CheckForIllegalCrossThreadCalls = false;
>
> But I'd rather like to understand a bit better about ways to handle
> these exceptions and diagnose them so have been playing with
> "Application.ThreadException" and
> "AppDomain.CurrentDomain.UnhandledException", the problem I have is
> "Application.ThreadException" never seems to fire and this is cunfusing
> the hell out of me. I have the following simple test code
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Text;
> using System.Threading;
> using System.Windows.Forms;
>
> namespace TestApp {
>    public partial class Form1 : Form {
>        public Form1() {
>            InitializeComponent();
>            Application.ThreadException += new
> ThreadExceptionEventHandler(Application_ThreadException);
>            AppDomain.CurrentDomain.UnhandledException += new
> UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
>        }
>
>        void CurrentDomain_UnhandledException(object sender,
> UnhandledExceptionEventArgs e) {
>            MessageBox.Show("CurrentDomain_UnhandledException " +
> e.ExceptionObject.ToString());
>
>        }
>
>        void Application_ThreadException(object sender,
> ThreadExceptionEventArgs e) {
>            MessageBox.Show("Application_ThreadException");
>        }
>
>        private void exceptionButton_Click(object sender, EventArgs e)
> {
>            Thread t = new Thread(delegate() {
>                int zero = 0;
>                int x = 1 / zero;
>            });
>            t.IsBackground = true;
>            t.Start();
>        }
>
>        private void crossThread_Click(object sender, EventArgs e) {
>            Thread t = new Thread(delegate() {
>                crossThread.Text = "Error";
>            });
>            t.IsBackground = true;
>            t.Start();
>        }
>    }
> }
>
> Which is just a windows form that has 2 buttons, crossThreadButton &
> exceptionButton, crossThreadButton simply creates a thread that tries
> to access a control it shouldn't, and exceptionButton simply divides by
> 0 to create a exception, both cause the
> "AppDomain.CurrentDomain.UnhandledException" event to be fired, but
> niether cause the "Application.ThreadException" event to be fired which
> is confusing me.
>
> When should "Application.ThreadException" get called, am I missing a
> setting or is it only for specific situations.
>
> Also is there a way to prevent the application from exiting when there
> is a exception in a thread and
> "AppDomain.CurrentDomain.UnhandledException" is fired, In my main
> shoddy app I'm 99.99% sure that exceptions in threads that have a long
> lifetime are handled and that these problems are been caused in
> shortlived threads that if they fail the work will simply be picked up
> on the next iteration, there is a reasonable amount of manual work
> involved in setting up and configuring the app and loosing all this is
> a pain for the user, if they could be informed of the error but allowed
> to continue that would be a lot easier for me while I find all the
> causes of the problem.
>

AddThis Social Bookmark Button