public override void OnException(ExceptionContext context)
        {
            var errorMessage = "An error has occurred.";

            var exception = context.Exception;

            if (exception == null)
            {
                // Should never happen.
                return;
            }

            PublicApi.ErrorResponseModel   publicErrorModel   = null;
            InternalApi.ErrorResponseModel internalErrorModel = null;
            if (exception is BadRequestException badRequestException)
            {
                context.HttpContext.Response.StatusCode = 400;
                if (badRequestException.ModelState != null)
                {
                    if (_publicApi)
                    {
                        publicErrorModel = new PublicApi.ErrorResponseModel(badRequestException.ModelState);
                    }
                    else
                    {
                        internalErrorModel = new InternalApi.ErrorResponseModel(badRequestException.ModelState);
                    }
                }
                else
                {
                    errorMessage = badRequestException.Message;
                }
            }
            else if (exception is StripeException stripeException &&
                     stripeException?.StripeError?.ErrorType == "card_error")
            {
                context.HttpContext.Response.StatusCode = 400;
                if (_publicApi)
                {
                    publicErrorModel = new PublicApi.ErrorResponseModel(stripeException.StripeError.Parameter,
                                                                        stripeException.Message);
                }
                else
                {
                    internalErrorModel = new InternalApi.ErrorResponseModel(stripeException.StripeError.Parameter,
                                                                            stripeException.Message);
                }
            }
Exemplo n.º 2
0
        public override void OnException(ExceptionContext context)
        {
            var errorMessage = "An error has occurred.";

            var exception = context.Exception;

            if (exception == null)
            {
                // Should never happen.
                return;
            }

            InternalApi.ErrorResponseModel internalErrorModel = null;
            if (exception is BadRequestException badRequestException)
            {
                context.HttpContext.Response.StatusCode = 400;
                if (badRequestException.ModelState != null)
                {
                    internalErrorModel = new InternalApi.ErrorResponseModel(badRequestException.ModelState);
                }
                else
                {
                    errorMessage = badRequestException.Message;
                }
            }
            else if (exception is GatewayException)
            {
                errorMessage = exception.Message;
                context.HttpContext.Response.StatusCode = 400;
            }
            else if (exception is NotSupportedException && !string.IsNullOrWhiteSpace(exception.Message))
            {
                errorMessage = exception.Message;
                context.HttpContext.Response.StatusCode = 400;
            }
            else if (exception is ApplicationException)
            {
                context.HttpContext.Response.StatusCode = 402;
            }
            else if (exception is NotFoundException)
            {
                errorMessage = "Resource not found.";
                context.HttpContext.Response.StatusCode = 404;
            }
            else if (exception is SecurityTokenValidationException)
            {
                errorMessage = "Invalid token.";
                context.HttpContext.Response.StatusCode = 403;
            }
            else if (exception is UnauthorizedAccessException)
            {
                errorMessage = "Unauthorized.";
                context.HttpContext.Response.StatusCode = 401;
            }
            else
            {
                var logger = context.HttpContext.RequestServices.GetRequiredService <ILogger <ExceptionHandlerFilterAttribute> >();
                logger.LogError(0, exception, exception.Message);
                errorMessage = "An unhandled server error has occurred.";
                context.HttpContext.Response.StatusCode = 500;
            }

            var errorModel = internalErrorModel ?? new InternalApi.ErrorResponseModel(errorMessage);
            var env        = context.HttpContext.RequestServices.GetRequiredService <IWebHostEnvironment>();

            if (env.IsDevelopment())
            {
                errorModel.ExceptionMessage      = exception.Message;
                errorModel.ExceptionStackTrace   = exception.StackTrace;
                errorModel.InnerExceptionMessage = exception?.InnerException?.Message;
            }
            context.Result = new ObjectResult(errorModel);
        }