web-dev-qa-db-fra.com

Existe-t-il un moyen d'attraper globalement toutes les erreurs non heurtées dans une application de blazor une seule page?

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.

7
TroelsGP

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();
1
Marcel W