Ответ 1
Несколько месяцев назад я разработал систему контроля ошибок для этого задания. В этом проекте я использовал эти основные коды, чтобы поймать любые исключения в win32:
System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Catch all handled exceptions in managed code, before the runtime searches the Call Stack
AppDomain.CurrentDomain.FirstChanceException += FirstChanceException;
// Catch all unhandled exceptions in all threads.
AppDomain.CurrentDomain.UnhandledException += UnhandledException;
// Catch all unobserved task exceptions.
TaskScheduler.UnobservedTaskException += UnobservedTaskException;
// Catch all unhandled exceptions.
System.Windows.Forms.Application.ThreadException += ThreadException;
// Catch all WPF unhandled exceptions.
Dispatcher.CurrentDispatcher.UnhandledException += DispatcherUnhandledException;
И методы слушателя:
/// <summary>
/// Used for handling WPF exceptions bound to the UI thread.
/// Handles the <see cref="System.Windows.Threading.DispatcherUnhandledExceptionEventHandler"/> events.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException
{
// catch error ...
}
/// <summary>
/// Used for handling WinForms exceptions bound to the UI thread.
/// Handles the <see cref="System.Threading.ThreadExceptionEventHandler"/> events in <see cref="System.Windows.Forms.Application"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static ThreadExceptionEventHandler ThreadException
{
// catch error ...
}
/// <summary>
/// Used for handling general exceptions bound to the main thread.
/// Handles the <see cref="AppDomain.UnhandledException"/> events in <see cref="System"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static UnhandledExceptionEventHandler UnhandledException
{
// catch error ...
}
/// <summary>
/// Used for handling System.Threading.Tasks bound to a background worker thread.
/// Handles the <see cref="UnobservedTaskException"/> event in <see cref="System.Threading.Tasks"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static EventHandler<UnobservedTaskExceptionEventArgs> UnobservedTaskException
{
// catch error ...
}
/// <summary>
/// This is new to .Net 4 and is extremely useful for ensuring that you ALWAYS log SOMETHING.
/// Whenever any kind of exception is fired in your application, a FirstChangeExcetpion is raised,
/// even if the exception was within a Try/Catch block and safely handled.
/// This is GREAT for logging every wart and boil, but can often result in too much spam,
/// if your application has a lot of expected/handled exceptions.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static EventHandler<FirstChanceExceptionEventArgs> FirstChanceException
{
// catch error ...
}
Если вы делаете исключение в своих кодах, вы должны быть уверены, что поймаете это по этим событиям, но когда перед выполнением приложения возникло исключение, тогда эти события не возникают, чтобы показывать или делать какие-либо вещи.
Например, вы не добавили все ссылки на сборки в свой проект, а затем это вызвало исключение в время запуска приложения.
И некоторые другие исключения могут иметь innerException, потому что они созданы с помощью thread
или task
s. Поэтому вы должны проверить все exception.innerException
.
Я надеюсь представить вам решение проблемы.