diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs index 896031aaaf..445ccbaba0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs +++ b/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( + public virtual void Log( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func 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(); + _userExceptionInformer = _serviceScope.ServiceProvider.GetRequiredService(); } - public bool IsEnabled(LogLevel logLevel) + public virtual bool IsEnabled(LogLevel logLevel) { return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; } - public IDisposable BeginScope(TState state) + public virtual IDisposable BeginScope(TState state) { return NullDisposable.Instance; } - public void Dispose() + public virtual void Dispose() { _serviceScope?.Dispose(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs new file mode 100644 index 0000000000..4399e706ec --- /dev/null +++ b/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); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs new file mode 100644 index 0000000000..067248d7e9 --- /dev/null +++ b/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); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs new file mode 100644 index 0000000000..d860467b12 --- /dev/null +++ b/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; + } + } +} diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs index 287b423c20..c54ba24405 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs +++ b/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 {