Month: October 2014

How to manage unhandled exception

Here is a small console application ;


using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication
{
    public static class Program
    {
    	static void Main()
    	{
    		AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;

    		Application.ThreadException += Application_ThreadException;
    		Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    		Application.Run(new TestForm());

    		throw new Exception("Main");
    	}

    	static void Application_ThreadException(Object sender, ThreadExceptionEventArgs e)
    	{
    		MessageBox.Show(e.Exception.Message, "Application.ThreadException");
    	}

    	static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
    	{
    		MessageBox.Show(((Exception)e.ExceptionObject).Message, "AppDomain.UnhandledException");
    	}
    }

    public class TestForm : Form
    {
    	public TestForm()
    	{
    		this.Text = "Test Application";
    		this.ClientSize = new Size(200, 60);
    		this.MinimumSize = this.Size;
    		this.MaximumSize = this.Size;
    		this.StartPosition = FormStartPosition.CenterScreen;

    		Button btnThrowException = new Button();

    		btnThrowException.Text = "Throw";
    		btnThrowException.Location = new Point(0, 0);
    		btnThrowException.Size = new Size(200, 30);
    		btnThrowException.Click += (s, e) => { throw new Exception("Throw"); };

    		Button btnThrowExceptionOnOtherThread = new Button();

    		btnThrowExceptionOnOtherThread.Text = "Throw on other thread";
    		btnThrowExceptionOnOtherThread.Location = new Point(0, 30);
    		btnThrowExceptionOnOtherThread.Size = new Size(200, 30);
    		btnThrowExceptionOnOtherThread.Click += (s, e) => new Thread(() => { throw new Exception("Other thread"); }).Start();

    		this.Controls.Add(btnThrowException);
    		this.Controls.Add(btnThrowExceptionOnOtherThread);
    	}
    }
}