如何配置全局错误处理程序?

How can I configure my global error handler?

提问人:Какосян Владимир 提问时间:11/17/2023 更新时间:11/17/2023 访问量:28

问:

我有我的自定义错误类: 使用 Newtonsoft.Json;

namespace Services.Errors.Exceptions;

public class HttpResponseException : Exception
{
public int StatusCode { get; private set; }

public HttpResponseException(int statusCode , string message) : base(message)
    {
    StatusCode = statusCode;
    }
}

我还有一个错误处理程序:

using System.Net;
using System.Text.Json;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Services.Contracts;
using Services.Errors.Exceptions;
using JsonSerializer = System.Text.Json.JsonSerializer;

namespace Services.Errors.Handler;

public class ErrorHandlingMiddleware : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        if (context.Exception is HttpResponseException httpResponseMessage)
        {
            var error = new ErrorDto()
            {
                Code = httpResponseMessage.StatusCode,
                Description = context.Exception.Message
            };

            context.Result = new JsonResult(error) { StatusCode =  (int)httpResponseMessage.StatusCode};
        }
    }
}

我在 Program.cs 类中注册了我的处理程序,它应该向控制器返回响应:

builder.Services.AddControllers(options =>
{
    options.Filters.Add(typeof(ErrorHandlingMiddleware));
});

我有一个问题。例如,当我抛出自定义异常时,例如在控制器中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using Host.Core.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Sentry;
using Services.Abstractions;
using Services.Contracts;
using Services.Errors.Exceptions;

namespace Host.Core.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CheckController : ControllerBase
    {
        private ILogger<CheckController> _logger;
        private IServiceIntegration _service;
        private IMapper _mapper;

        public CheckController(ILogger<CheckController> logger, IServiceIntegration service, IMapper mapper)
        {
            _logger = logger;
            _service = service;
            _mapper = mapper;
        }

        [HttpPost]
        public async Task<IActionResult> Client(TransactionModel trnModel)
        {
            throw new HttpResponseException(404, "NotFound");
        }
    }
}

它返回我期望的响应:

{
  "code": 404,
  "description": "NotFound"
}

但是当我在发送请求时收到 404 错误并且抛出异常时,类中的正常错误将返回给我 Exception():

System.Exception: Services.Errors.Exceptions.HttpResponseException: NotFound
C# asp.net .NET 异常

评论


答: 暂无答案