У меня есть статический класс, который создает несколько рабочих потоков в своем конструкторе. Если исключение возникает до того, как рабочие были созданы, мой обработчик Application.ThreadException (используется для закрытия приложения, если возникает ошибка, о которой известно, что она не может быть исправлена) срабатывает нормально, и все в порядке. Однако после создания первого рабочего потока в дополнение к запуску обработчика появляется сообщение «MYAPP столкнулся с проблемой и должен быть закрыт. Приносим извинения за неудобства». диалог для сообщения об ошибках MS.
В этом конкретном случае я могу переупорядочить код для создания потоков в последнюю очередь (после любых проблем инициализации / доступа к ресурсам, которые могли вызвать исключение), но это не более, чем просто указание на проблему и не дает мне никакого информация о том, что на самом деле происходит.
Надеюсь, я вырезал достаточно кода из моего приложения, чтобы показать, что я пытаюсь сделать здесь.
class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
Application.Run(theForm);
theForm.Dispose();
}
catch (Exception e)
{
//doing this to use the same handler here and for Application.ThreadException
ThreadExceptionEventArgs argsEx = new ThreadExceptionEventArgs(e);
FatalExceptionHandler(null, argsEx);
}
finally
{
MyStaticClass.KillThreads();
}
}
public static void FatalExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs ex)
{
Exception e = ex.Exception;
try
{
//lots of stuff to give more useful error messages for known problems
//and display them in a messagebox.
}
// if anything went wrong scraping the exception text for formatting, show the raw value.
catch
{
MessageBox.Show(e.Message);
return;
}
// after showing the MessageBox, close out the app.
finally
{
System.Environment.Exit(1);
}
}
}
class MyStaticClass
{
static MyStaticClass()
{
myThread = new Thread(new ThreadStart(SomeMethod));
//if this exception is thrown everything works normally
//Throw new Exception("KABOOM");
myThread.Start();
//if this exception is thrown a windows error reporting dialog appears
//along with the messagebox from program.FatalExcetion handlder
//Throw new Exception("KABOOM");
}
public void KillThreads()
{
//clean up the worker threads
}
}