asp.net核心无法抛出异步异常

时间:2018-10-17 21:28:52

标签: c# asp.net-core exception-handling async-await

我在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

示例https://github.com/skynet2/net-core-debugger-issue/blob/master/WebApplication2/Controllers/ValuesController.cs

经过一些进一步的研究,我找到了这种奇怪行为的原因。就我而言,问题出在DataServerExceptionFilter内部,原因是 Debugger.Break() ;;

我在异常过滤器的每一行上都设置了一个断点,奇怪的是断点在Debugger.Break工作之前,但是在Dubbuger.Break之后,整个处理都停止了。这不适用于异步,但适用于.Wait()

0 个答案:

没有答案