Yuval 的答案是定制对 Web API 捕获的未处理异常的响应,而不是用于记录,如链接页面上所述。有关详细信息,请参阅页面上的“何时使用”部分。记录器总是被调用,但处理程序只有在可以发送响应时才会被调用。简而言之,使用logger进行记录,使用 handler 自定义响应。
顺便说一句,我正在使用程序集 v5.2.3 并且ExceptionHandler
该类没有该HandleCore
方法。我认为,等价物是Handle
。但是,简单的子类ExceptionHandler
化(如 Yuval 的回答)是行不通的。就我而言,我必须执行IExceptionHandler
如下。
internal class OopsExceptionHandler : IExceptionHandler
{
private readonly IExceptionHandler _innerHandler;
public OopsExceptionHandler (IExceptionHandler innerHandler)
{
if (innerHandler == null)
throw new ArgumentNullException(nameof(innerHandler));
_innerHandler = innerHandler;
}
public IExceptionHandler InnerHandler
{
get { return _innerHandler; }
}
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
Handle(context);
return Task.FromResult<object>(null);
}
public void Handle(ExceptionHandlerContext context)
{
// Create your own custom result here...
// In dev, you might want to null out the result
// to display the YSOD.
// context.Result = null;
context.Result = new InternalServerErrorResult(context.Request);
}
}
请注意,与记录器不同的是,您通过替换默认处理程序而不是添加来注册处理程序。
config.Services.Replace(typeof(IExceptionHandler),
new OopsExceptionHandler(config.Services.GetExceptionHandler()));