【发布时间】:2015-09-14 13:26:54
【问题描述】:
演示问题的代码:
- 假设 Test Thing 是一个真实的实现,例如 DB 调用。
- documentation for Web API states 表示未处理的异常将在全局处理程序中捕获,允许您对其进行处理。
- 如果我用 ExceptionFilter 替换 MyErrorHandler 这确实有效,除了我正在使用的代码库使用处理程序,因为错误逻辑是一个横切关注点,并且无论错误来自何处,都将是相同的。李>
- 如果抛出的异常类型不是 TaskCancelledException,则会按预期调用处理程序。
- 我也尝试过最新版本的 Web API (5.2.3)。
- 唯一的解决方法是在可能引发此类异常的任何地方添加一个 try/catch 块,不用说这很痛苦,我希望避免使用该处理程序。
鉴于这不是我的代码,我讨厌称其为错误,但经过数小时的尝试后,它开始有这种感觉。
using System;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.ExceptionHandling;
namespace WebApplication3.Controllers
{
public class TestController : ApiController
{
public async Task<string> Get()
{
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(1));
return await new TestThing().ExecuteAsync(cancellationTokenSource.Token);
}
}
public class MyErrorHandler : ExceptionHandler
{
public override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
}
public class TestThing
{
public async Task<string> ExecuteAsync(CancellationToken cancellationToken)
{
// Remove this to see the problem, I don't want to add these
// try/catch statements all over the codebase.
try
{
await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken);
}
catch (Exception ex)
{
throw new Exception("Failure...");
}
return await Task.FromResult("Testing...");
}
}
}
【问题讨论】:
标签: c# asp.net-web-api async-await