Eine globale Fehlerbehandlung durch "Umschließen" von Application.Run(...) mit einem try-catch-Block funktioniert aufgrund der Art und Weise wie Winforms unbehandelte Ausnahmen verarbeitet nicht.
Nachfolgend ein Beispiel wie es implementiert wird.
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
// Ereignis-Handler für UI-Threads:
Application.ThreadException +=
new System.Threading.ThreadExceptionEventHandler(
Application_ThreadException);
// Alle unbehandelten WinForms-Fehler durch diesen Ereignis-Handler
// zwingen (unabhängig von config-Einstellungen):
Application.SetUnhandledExceptionMode(
UnhandledExceptionMode.CatchException);
// Ereignis-Hanlder für nicht UI-Threads:
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(
CurrentDomain_UnhandledException);
// Dieser try-catch-Block ist im Prinzip nicht nötig.
// Hier ist er aber trotzdem damit die beiden Ereignisse
// an diesen weiterleiten können und der anschießende
// finally-Block zur Speicherbereinigung ausgeführt
// werden kann
try
{
// Anwenung ausführen:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
// Da es statische Ereignisse sind wird zur Speicherschonung
// der Handler entfernt:
AppDomain.CurrentDomain.UnhandledException -=
CurrentDomain_UnhandledException;
Application.ThreadException -=
Application_ThreadException;
}
}
//---------------------------------------------------------------------
/// <summary>
/// Ereignisbehandlung für Thread-Exceptions
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
// Weiterleiten der Exception:
throw e.Exception;
}
//---------------------------------------------------------------------
/// <summary>
/// Ereignisbehandlung für alle anderen unbehandelten Exceptions
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// Weiterleiten der Exception:
throw (Exception)e.ExceptionObject;
}
}
}
Kommentare zum Snippet