Yuval의 대답은 링크 된 페이지 에 명시된대로 로깅이 아닌 Web API에서 포착 된 처리되지 않은 예외에 대한 응답을 사용자 지정하는 것 입니다. 자세한 내용은 페이지의 사용시기 섹션을 참조하십시오. 로거는 항상 호출되지만 핸들러는 응답을 보낼 수있는 경우에만 호출됩니다. 간단히 말해서 로거 를 사용하여 로그하고 핸들러를 사용하여 응답을 사용자 정의하십시오.
그건 그렇고, 나는 어셈블리 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()));