コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
 private static Func <Task> ExecuteFilterAsync(IErrorDetailFilter filter, ErrorDetailContext context, Func <Task> nextFilterTask)
 {
     return(() => filter.OnProcessingAsync(context, nextFilterTask));
 }