Browse Source

Introduce UserExceptionInformer

pull/5706/head
Halil İbrahim Kalkan 6 years ago
parent
commit
97f07310dd
  1. 26
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs
  2. 10
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs
  3. 47
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs
  4. 16
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs
  5. 1
      framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs

26
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs

@ -8,20 +8,25 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
{
private readonly IServiceCollection _serviceCollection;
private IServiceScope _serviceScope;
private IUiMessageService _messageService;
private IUserExceptionInformer _userExceptionInformer;
public AbpExceptionHandlingLogger(IServiceCollection serviceCollection)
{
_serviceCollection = serviceCollection;
}
public void Log<TState>(
public virtual void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
{
if (exception == null)
{
return;
}
if (logLevel != LogLevel.Critical && logLevel != LogLevel.Error)
{
return;
@ -29,18 +34,15 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
TryInitialize();
if (_messageService == null)
if (_userExceptionInformer == null)
{
return;
}
//TODO: handle exception types
_messageService.ErrorAsync(
exception?.Message ?? state?.ToString() ?? "Unknown error!"
);
_userExceptionInformer.InformAsync(new UserExceptionInformerContext(exception));
}
private void TryInitialize()
protected virtual void TryInitialize()
{
var serviceProvider = _serviceCollection.GetServiceProviderOrNull();
if (serviceProvider == null)
@ -49,20 +51,20 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
}
_serviceScope = serviceProvider.CreateScope();
_messageService = _serviceScope.ServiceProvider.GetRequiredService<IUiMessageService>();
_userExceptionInformer = _serviceScope.ServiceProvider.GetRequiredService<IUserExceptionInformer>();
}
public bool IsEnabled(LogLevel logLevel)
public virtual bool IsEnabled(LogLevel logLevel)
{
return logLevel == LogLevel.Critical || logLevel == LogLevel.Error;
}
public IDisposable BeginScope<TState>(TState state)
public virtual IDisposable BeginScope<TState>(TState state)
{
return NullDisposable.Instance;
}
public void Dispose()
public virtual void Dispose()
{
_serviceScope?.Dispose();
}

10
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs

@ -0,0 +1,10 @@
using System;
using System.Threading.Tasks;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
{
public interface IUserExceptionInformer
{
Task InformAsync(UserExceptionInformerContext context);
}
}

47
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs

@ -0,0 +1,47 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client;
using Volo.Abp.Validation;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
{
public class UserExceptionInformer : IUserExceptionInformer, ITransientDependency
{
private readonly IUiMessageService _messageService;
public UserExceptionInformer(IUiMessageService messageService)
{
_messageService = messageService;
}
public virtual async Task InformAsync(UserExceptionInformerContext context)
{
if (context.Exception is AbpRemoteCallException remoteCallException)
{
await InformAbpRemoteCallExceptionAsync(remoteCallException, context);
}
else if (context.Exception is AbpValidationException validationException)
{
await InformAbpValidationExceptionAsync(validationException, context);
}
}
protected virtual async Task InformAbpRemoteCallExceptionAsync(AbpRemoteCallException exception, UserExceptionInformerContext context)
{
if (exception.Error.Details.IsNullOrEmpty())
{
await _messageService.ErrorAsync(exception.Error.Message);
}
else
{
await _messageService.ErrorAsync(exception.Error.Details, exception.Error.Message);
}
}
protected virtual async Task InformAbpValidationExceptionAsync(AbpValidationException exception, UserExceptionInformerContext context)
{
await _messageService.ErrorAsync(exception.Message);
}
}
}

16
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs

@ -0,0 +1,16 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling
{
public class UserExceptionInformerContext
{
[NotNull]
public Exception Exception { get; }
public UserExceptionInformerContext(Exception exception)
{
Exception = exception;
}
}
}

1
framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs

@ -1,6 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
namespace Volo.Abp.Http
{

Loading…
Cancel
Save