c# - 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.Title和exception.StatusCode ,并且这些元素在Exception类中不存在。在调试模式下,我可以看到这些元素存在,因为我抛出了CustomInvalidException。
我想保持 HandleExceptionAsync 方法尽可能通用,但我只能通过显式转换为CustomInvalidException来获取这些值(这不是我想要的)。我怎样才能获得尽可能通用的结果?
编辑
HandleExceptionAsync在ErrorHandlingMiddleware类中被调用:
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));