I assume you have not set the correct exception handling mode using Application.SetUnhandledExceptionMode() - just set it to UnhandledExceptionMode.ThrowException.
UPDATE
I just wrote a small test application and found nothing to work unexscpected. Could you try to reproduce your error with this test code?
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); } } }