我在asp.net核心中遇到重新抛出异常的问题。
在.net core 2.1.402下进行了测试
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { return Task.FromException(new Exception("ab")); });
try
{
await t;
}
catch (Exception ex)
{
throw;
var x = 0;
}
return Ok();
}
预期结果:应由asp.net核心异常过滤器\中间件等重新抛出并处理异常。
当前结果:我可以在catch闭包内捕获异常,但不会在asp.net级别上重新引发异常。该请求(在邮递员中)停留了几分钟。
我也尝试过:
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { throw new Exception("ab"); });
try
{
await t;
}
catch (Exception ex)
{
throw;
}
return Ok();
}
此代码与以前的代码完全相同。
对我来说唯一可行的解决方案是:
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { throw new Exception("ab"); });
try
{
t.Wait(TimeSpan.FromSeconds(10));
}
catch (Exception ex)
{
throw;
}
return Ok();
}
有人可以解释为什么我不能在前两种情况下重新引发异常吗?是这种现象,还是asp.net中的错误?
===更新10.18
经过一些进一步的研究,我找到了这种奇怪行为的原因。就我而言,问题出在DataServerExceptionFilter内部,原因是 Debugger.Break() ;;
我在异常过滤器的每一行上都设置了一个断点,奇怪的是断点在Debugger.Break工作之前,但是在Dubbuger.Break之后,整个处理都停止了。这不适用于异步,但适用于.Wait()