J'aimerais pouvoir attraper toutes les exceptions non fabriquées dans une seule place de construction d'une application de blazor à une seule page. Comme en utilisant la "actuelle.dispatcherunhandleXception" dans les applications WPF.
Cette question est exclusivement sur la gestion des exceptions côté client (Webassemblage). J'utilise Blazor version 3.0.0-Aperçu8.19405.7
Je cherche une solution, mais cela semble que cela n'existe pas. Sur la documentation Microsofts ( https://docs.microsoft.com/en-us/aspnet/core/blazor/handle-errors?view=aspnetcore-3. ) Il existe une liste des erreurs d'endroits peuvent survenir Et une promenade sur la façon de gérer chacun d'entre eux. Cela croit qu'il doit y avoir une manière plus épreuve de balle pour attraper tout.
Dans la version actuelle de Blazor Webassembly, toutes les exceptions non manquées sont capturées dans une classe interne et écrites à Console.Error
. Il n'y a actuellement aucun moyen de les attraper d'une manière différente, mais Rémi Bourgarel montre une solution pour pouvoir leur connecter et/ou prendre des actions personnalisées. Voir Blog de Remi .
Enregistreur simple pour les acheminer vers un iLogger:
public class UnhandledExceptionLogger : TextWriter
{
private readonly TextWriter _consoleErrorLogger;
private readonly ILogger _logger;
public override Encoding Encoding => Encoding.UTF8;
public UnhandledExceptionLogger(ILogger logger)
{
_logger = logger;
_consoleErrorLogger = Console.Error;
Console.SetError(this);
}
public override void WriteLine(string value)
{
_logger.LogCritical(value);
// Must also route thru original logger to trigger error window.
_consoleErrorLogger.WriteLine(value);
}
}
Maintenant dans le programme.CS Ajouter builder.Services.AddLogging...
et ajouter:
builder.Services.AddSingleton<UnhandledExceptionLogger>();
...
// Change end of Main() from await builder.Build().RunAsync(); to:
var Host = builder.Build();
// Make sure UnhandledExceptionLogger is created at startup:
Host.Services.GetService<UnhandledExceptionLogger>();
await Host.RunAsync();