C# – Behandeln Sie die Ausnahme einer fehlerhaften Aufgabe

C# – Behandeln Sie die Ausnahme einer fehlerhaften Aufgabe

Wenn eine Aufgabe eine Ausnahme auslöst und nicht mehr ausgeführt wird, liegt ein Fehler vor. Die Frage ist, wie erhalten Sie die Ausnahme, die von der fehlerhaften Aufgabe ausgelöst wurde?

Dies hängt davon ab, ob Sie auf die Aufgabe warten oder nicht.

Dieser Artikel zeigt, wie die Ausnahme einer fehlerhaften Aufgabe in zwei Szenarien behandelt wird:wenn Sie auf die Aufgabe warten und wenn Sie nicht darauf warten.

Behandeln der Ausnahme einer unerwarteten Aufgabe

Angenommen, Sie starten eine Hintergrundaufgabe und warten nicht darauf. Diese Aufgabe kann alles Mögliche tun, beispielsweise das Überwachen des Dateisystems. Wenn es ausfällt, möchten Sie reagieren können. In diesem Beispiel protokolliere ich einfach die Grundursachenausnahme.

Um die Ausnahme der Aufgabe zu behandeln, fügen Sie eine Fortsetzung hinzu, indem Sie .ContinueWith() aufrufen und die Option TaskContinuationOptions.OnlyOnFaulted angeben. Das bedeutet, dass die Fortsetzung nur ausgeführt wird, wenn die Aufgabe eine Ausnahme hatte.

Die Ausnahme der Fortsetzungsaufgabe ist eine AggregateException. Verwenden Sie zum Abrufen der Grundursachenausnahme GetBaseException().

Task.Run(BackgroundTask).ContinueWith(t =>
{
	var ex = t.Exception?.GetBaseException();
	if (ex != null)
	{
		Logger.Error($"Task faulted and stopped running. ErrorType={ex.GetType()} ErrorMessage={ex.Message}");
	}
},
TaskContinuationOptions.OnlyOnFaulted);
Code language: C# (cs)

Ich werfe absichtlich eine NotFiniteNumberException in die Hintergrundaufgabe. Wenn ich also diesen Code ausführe, erhalte ich Folgendes:

Task faulted and stopped running. ErrorType=System.NotFiniteNumberException ErrorMessage=Number encountered was not a finite quantity.Code language: plaintext (plaintext)

Behandeln der Ausnahme einer erwarteten Aufgabe

Wenn Sie auf die Aufgabe warten können, ist es viel einfacher. Sie können die Aufgabe innerhalb eines Try/Catch-Blocks abwarten. Wenn die Aufgabe fehlschlägt, entpackt das Framework die AggregateException, sodass Sie die ausgelöste Basisausnahme behandeln können.

try
{
	await BackgroundTaskAsync();
}
catch (Exception ex)
{
	Logger.Error($"Task faulted and stopped running. ErrorType={ex.GetType()} ErrorMessage={ex.Message}");
}
Code language: C# (cs)

Wenn ich diesen Code ausführe, erhalte ich Folgendes:

Task faulted and stopped running. ErrorType=System.NotFiniteNumberException ErrorMessage=Number encountered was not a finite quantity.Code language: plaintext (plaintext)