Exceptions non prises en charge d’un BackgroundService
Dans les versions précédentes, lorsqu’un BackgroundService levait une exception non prise en charge, l’exception était perdue, et le service ne répondait pas. .NET 6 corrige ce comportement en journalisant l’exception et en arrêtant l’hôte.
Description de la modification
Dans les versions précédentes de .NET, lorsqu’une exception est levée à partir d’un remplacement BackgroundService.ExecuteAsync(CancellationToken), l’exception est perdue et le service ne répond pas. L’hôte continue à s’exécuter et aucun message n’est enregistré.
À compter de .NET 6, une exception générée à partir d’un remplacement BackgroundService.ExecuteAsync(CancellationToken) est enregistrée dans le ILogger actuel. Par défaut, l’hôte est arrêté en cas d’exception non prise en charge.
Version introduite
.NET 6
Raison du changement
Ce nouveau comportement est cohérent avec celui des autres modèles d’application face à des exceptions non gérées. Il est également déroutant pour les développeurs que leur BackgroundService rencontre une erreur, mais que rien ne soit journalisé. Le meilleur comportement par défaut consiste à arrêter l’hôte, car les exceptions non gérées ne doivent pas être ignorées. Elles indiquent un problème qui mérite une attention particulière.
Action recommandée
Si vous préférez conserver le comportement précédent, qui consiste à autoriser une exception non prise en charge dans un BackgroundService à ne pas arrêter l’hôte, vous pouvez définir HostOptions.BackgroundServiceExceptionBehavior sur BackgroundServiceExceptionBehavior.Ignore.
Host.CreateBuilder(args)
.ConfigureServices(services =>
{
services.Configure<HostOptions>(hostOptions =>
{
hostOptions.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore;
});
});