Feedback

C# - Globale Fehlerbehandlung für Winform

Veröffentlicht von am 07.10.2008
(2 Bewertungen)
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.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

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;
		}
	}
}
Abgelegt unter Fehlerbehandlung, Global, Winform, try-catch.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!