异步lambda中抛出的异常不会被代码捕获

时间:2017-06-20 22:27:26

标签: c# asynchronous lambda

我已经看过类似的问题(例如herehere),但我仍然不确定为什么我的代码的行为方式如此。 我正在编写一些使用异步函数执行某些线程特定工作的单元测试,但问题是抛出的异常没有被捕获。这是我的意思的一个简单例子:

    static void Main(string[] args)
    {
        ExecuteWillCatch(async () =>
        {
            await MyTaskFunction();
            throw new Exception("I throw an exception");
        });
    }

    static void MyAction()
    {
        MyTaskFunction();
        throw new Exception("I throw an exception!");
    }

    static async Task MyTaskFunction()
    {

    } 
    static void ExecuteWillCatch(Action action)
    {
        var op = new ThreadStart(() =>
        {
            try
            {
                action.Invoke();
            }
            catch (Exception e)
            {
                Console.WriteLine("I caught the exception");
            }

        });
        var thread = new Thread(op);
        thread.Start();
        thread.Join();
    }

如果我在我的测试中使用async lambda,那么会发生异常,即在预期的目标上抛出异常,然后在mscorlib中重新抛出,然后在try中捕获 not ExecuteWillCatch中的-catch块。如果我只是等待结果替换async / await,一切都会通过。这是我可以使用的解决方法,但我希望理想地测试将要使用的代码(使用async / await)。 我也尝试在主函数中放置try-catch块,并在线程调用周围,认为可能异常被抛回到该线程,但情况也不是这样。

任何人都可以建议一种方法来做到这一点,或解释为什么它不起作用?

0 个答案:

没有答案