public async Task <ErrorDetails> GenerateAsync(Exception exception) { var errorDetailContext = new ErrorDetailContext { Exception = exception, TargetSite = exception.TargetSite }; await ProcessAsync(errorDetailContext); var errorDetails = new ErrorDetails( errorDetailContext.Exception.GetType().Name, errorDetailContext.Message, errorDetailContext.Code, GetMemberName(errorDetailContext.TargetSite)); if (_errorDetailsOptions.Value.InnerErrorsFromInnerExceptions) { foreach (var innerException in errorDetailContext.InnerExceptions) { var innerError = await GenerateAsync(innerException); errorDetails.InnerErrors.Add(innerError); } } if (_errorDetailsOptions.Value.StackTraceProcessing) { var stackTrace = new StackTrace(exception, false); var stackFrames = stackTrace.GetFrames(); foreach (var stackFrame in stackFrames) { var stackFrameErrorDetail = new ErrorDetailContext { TargetSite = stackFrame.GetMethod() }; await ProcessAsync(stackFrameErrorDetail); if (_errorDetailsOptions.Value.UnspecificyErrorMessages || stackFrameErrorDetail.Message != null) { var errorMessageValue = stackFrameErrorDetail.Message; var errorMessageCode = stackFrameErrorDetail.Code; var errorMessageFirstMember = stackFrameErrorDetail.Members .FirstOrDefault(x => x.DeclaringType?.IsInterface == false); var errorMessage = new ErrorMessage( errorMessageValue, errorMessageCode, GetMemberName(errorMessageFirstMember)); errorDetails.SecondaryMessages.Add(errorMessage); } } } return(errorDetails); }
private async Task ProcessAsync(ErrorDetailContext context) { var errorDetailContext = context; var errorFilters = _errorDetailFilterProvider.GetAll() .Reverse() .ToArray(); Func <Task> errorFilterTask = () => Task.CompletedTask; foreach (var errorFilter in errorFilters) { errorFilterTask = ExecuteFilterAsync( errorFilter, errorDetailContext, errorFilterTask); } await errorFilterTask(); }
private static Func <Task> ExecuteFilterAsync(IErrorDetailFilter filter, ErrorDetailContext context, Func <Task> nextFilterTask) { return(() => filter.OnProcessingAsync(context, nextFilterTask)); }