Відповіді:
Application.ThreadException характерний лише для Windows Forms. Winforms запускає обробників подій у відповідь на повідомлення, надіслані йому Windows. Наприклад, подія Click, я впевнений, що ви їх знаєте. Якщо такий обробник подій кидає виняток, всередині циклу повідомлень Winforms є зворотна зупинка, яка фіксує це виключення.
Цей запуск спрацьовує подія Application.ThreadException . Якщо ви не перекриєте це, користувач отримає ThreadExceptionDialog . Що дозволяє йому ігнорувати виняток і продовжувати запускати вашу програму. Не чудова ідея btw.
Ви можете відключити цю поведінку, зателефонувавши Application.SetUnhandledExceptionMode () методом Main () у Program.cs. Без цього стоп-сигналу звичайна річ відбувається, коли потік гине від необробленого винятку: AppDomain.UnhandledException спрацьовує і програма припиняється.
Fwiw: "ThreadException" був дуже поганим вибором імені. Це не має нічого спільного з нитками.
З джерела :
У додатках, що використовують Windows Forms, незроблені винятки в основному потоці додатків викликають
Application.ThreadException
подія. Якщо ця подія обробляється, поведінка за замовчуванням полягає в тому, що необроблений виняток не припиняє роботу програми, хоча програма залишається у невідомому стані. У цьому випадкуUnhandledException
подія не піднімається. Цю поведінку можна змінити, скориставшись файлом конфігурації програми, або за допомогоюApplication.SetUnhandledExceptionMode
методу змінити режим,UnhandledExceptionMode.ThrowException
перш ніжThreadException
підключити обробник подій. Це стосується лише основного потоку програми.UnhandledException
Подія викликається для необроблених винятків викинутих в інших потоках.Починаючи з Visual Studio 2005 , програма додатків Visual Basic надає ще одну подію для безперебійних винятків у головному потоці програми -
WindowsFormsApplicationBase.UnhandledException
. У цій події є об'єкт аргументів події з тим самим іменем, що і об'єкт аргументів події, який використовується AppDomain.UnhandledException, але з різними властивостями. Зокрема, цей об'єкт аргументів події маєExitApplication
властивість, яка дозволяє програмі продовжувати працювати, ігноруючи необроблений виняток (і залишаючи програму у невідомому стані). У цьому випадку подія AppDomain.UnhandledException не підвищується.
Application.ThreadException
можна зловити, і додаток може продовжуватися (загалом це не чудова ідея, але для програми, як періодично виконувати деякі дії, це хороше рішення).
Щоб знайти винятки, що виникають у потоках, які не створені та належать Windows Forms, використовуйте AppDomain.UnhandledException
. Це дозволяє додатку реєструвати інформацію про виняток до того, як обробник за замовчуванням системи повідомить про виняток користувачеві та припинить програму.
Поводження з цим винятком не заважає припинити застосування.
Максимум, що можна зробити (дані програми можуть бути пошкоджені, коли винятки не обробляються) - це збереження даних програми для подальшого відновлення. Після цього домен програми вивантажується, і додаток припиняється.
Починаючи з .NET 4 , ця подія не піднімається за винятками, які пошкоджують стан процесу, наприклад, переповнення стека чи порушення доступу, якщо тільки обробник подій не є критичним для безпеки та не має
HandleProcessCorruptedStateExceptionsAttribute
атрибута.
Детальніше див. У MSDN .
Гаразд - у мене це було переді мною, цей біт коду від msdn досить зрозумілий:
public static void Main(string[] args)
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms
// errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Runs the application.
Application.Run(new ErrorHandlerForm());
}
Ну, справа в тому, що ThreadException
виникає через проблему з вашою потоком, Unhandled Exception
вимкнено, якщо код викидає виняток, який не обробляється.
Найпростіший спосіб викликати другий - створити додаток без спроб ... ловити блоки та кидати виняток.
Тепер, якщо вам потрібна страховка, ви можете впоратися з ними обома, однак, якщо ви захоплюєте та обробляєте їх exceptions
правильно, тоді вам не потрібен UnhandledException
обробник, оскільки це як би спійманий все.
Application.ThreadException
. Я поставив питання для цього [тут ] зі своїм маленьким кодом C #.