Blazor на стороне клиента Обработка исключений на уровне приложений

Как глобально обрабатывать исключения уровня приложений для клиентских приложений Blazor?

1 ответ

Вы можете создать одноэлементный сервис, который обрабатывает событие WriteLine. Это будет срабатывать только на ошибки благодаря Console.SetError(this);

public class ExceptionNotificationService : TextWriter
{
    private TextWriter _decorated;
    public override Encoding Encoding => Encoding.UTF8;

    public event EventHandler<string> OnException;

    public ExceptionNotificationService()
    {
        _decorated = Console.Error;
        Console.SetError(this);
    }

    public override void WriteLine(string value)
    {
        OnException?.Invoke(this, value);

        _decorated.WriteLine(value);
    }
}

Затем вы добавляете его в файл Startup.cs в функции ConfigureServices:

services.AddSingleton<ExceptionNotificationService>();

Чтобы использовать его, вы просто подписываетесь на событие OnException в вашем главном окне.

Источник

@ Ответ Геррита устарел. Теперь вы должны использовать ILogger для обработки необработанного исключения.

Мой пример

public interface IUnhandledExceptionSender
{
    event EventHandler<Exception> UnhandledExceptionThrown;
}

public class UnhandledExceptionSender : ILogger, IUnhandledExceptionSender
{

    public event EventHandler<Exception> UnhandledExceptionThrown;

    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,
        Exception exception, Func<TState, Exception, string> formatter)
    {            
        if (exception != null)
        {                
            UnhandledExceptionThrown?.Invoke(this, exception);
        }            
    }
}

Program.cs

var unhandledExceptionSender = new UnhandledExceptionSender();
var myLoggerProvider = new MyLoggerProvider(unhandledExceptionSender);
builder.Logging.AddProvider(myLoggerProvider);
builder.Services.AddSingleton<IUnhandledExceptionSender>(unhandledExceptionSender);
Другие вопросы по тегам