首页 > 解决方案 > C# 异常处理:获取扩展 CustomException 的元素

问题描述

我想捕获自定义异常并返回一个包含异常信息的自定义对象。为此,我创建了一个扩展Extension的自定义CustomInvalidException

[Serializable]
public class CustomInvalidException<T> : Exception
    where T : Entity
{
    public string Title { get; set; }
    public HttpStatusCode StatusCode { get; set; }

    public CustomInvalidException(string message)
        : base($"{typeof(T).Name}: {message}")
    {
        this.Title = "Custom invalid exception";
        this.StatusCode = HttpStatusCode.BadRequest;
    }
}

在某些时候我可以抛出这个异常:

if (something) throw new CustomInvalidException<CustomEntity>(message);

我可以捕获这个异常并在我使用的一些中间件中处理它:

private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
    // Here I want to create a response with error information
    context.Response.ContentType = "application/json";

    context.Response.StatusCode = (int)exception.StatusCode;

    var result = new {exception.Title, exception.StatusCode, exception.Message}

    return context.Response.WriteAsync(JsonConvert.SerializeObject(result));
}

这会产生错误,因为我尝试获取exception.Titleexception.StatusCode ,并且这些元素在Exception类中不存在。在调试模式下,我可以看到这些元素存在,因为我抛出了CustomInvalidException

我想保持 HandleExceptionAsync 方法尽可能通用,但我只能通过显式转换为CustomInvalidException来获取这些值(这不是我想要的)。我怎样才能获得尽可能通用的结果?

编辑

HandleExceptionAsyncErrorHandlingMiddleware类中被调用:

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
     // Handle exception
    }
}

依次在 Startup.cs 的配置中调用:

app.UseMiddleware(typeof(ErrorHandlingMiddleware));

标签: c#exception-handling

解决方案


推荐阅读