C# – Gestisce l'eccezione di un'attività in errore

C# – Gestisce l'eccezione di un'attività in errore

Quando un'attività genera un'eccezione e interrompe l'esecuzione, si è verificato un errore. La domanda è:come si ottiene l'eccezione generata dall'attività in errore?

Questo dipende se stai aspettando l'attività o meno.

Questo articolo mostra come gestire l'eccezione di un'attività in errore in due scenari:quando sei in attesa dell'attività e quando non la stai aspettando.

Gestione dell'eccezione di un'attività non attesa

Diciamo che stai avviando un'attività in background e non la stai aspettando. Questa attività potrebbe eseguire qualsiasi cosa, come il monitoraggio del file system. Quando fallisce, vuoi essere in grado di reagire. In questo esempio, sto semplicemente registrando l'eccezione della causa principale.

Per gestire l'eccezione dell'attività, aggiungi una continuazione chiamando .ContinueWith() e specifica l'opzione TaskContinuationOptions.OnlyOnFaulted. Ciò significa che la continuazione verrà eseguita solo se l'attività ha un'eccezione.

L'eccezione dell'attività di continuazione è un AggregateException. Per ottenere l'eccezione della causa principale, utilizzare 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)

Sto lanciando di proposito un NotFiniteNumberException nell'attività in background. Quindi, quando eseguo questo codice, ottengo quanto segue:

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

Gestione dell'eccezione di un'attività attesa

Se sei in grado di attendere l'attività, è molto più semplice. Puoi attendere l'attività all'interno di un blocco try/catch. Quando l'attività è in errore, il framework annulla il wrapping di AggregateException, consentendoti di gestire l'eccezione di base generata.

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

Quando eseguo questo codice, ottengo quanto segue:

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