Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步try catch-异常变量为null_C#_.net_Async Await - Fatal编程技术网

C# 异步try catch-异常变量为null

C# 异步try catch-异常变量为null,c#,.net,async-await,C#,.net,Async Await,本代码仅用于学习/测试目的: 我故意在任务中引发异常。运行(…)并从WindowsForm按钮调用它Clickeventhandler: async void button_Click(object sender, EventArgs e) { try { await Task.Run( () => { throw new Exception("Foo");

本代码仅用于学习/测试目的:

我故意在任务中引发异常。运行(…)并从WindowsForm按钮调用它Clickeventhandler:

async void button_Click(object sender, EventArgs e)
{
    try
    {
        await Task.Run(
            () =>
            {
                throw new Exception("Foo");
            }
        );
    }
    catch (Exception ex) { }
}
当我调试应用程序并在catch语句中设置断点时,我看到变量“ex”的值为null。这是为什么?我如何捕获异常内容? (如果之后使用Task.Wait()或ContinueWith(),则会正确捕获它,但我想知道在使用Wait时如何捕获它)

奇怪的是: 如果在catch中插入“Debug.WriteLine(ex.Message);”语句,则ex不再为null。 如果我再次删除“Debug.WriteLine(ex.Message);”语句并运行代码,则ex不为null。显然,在某些运行中,ex具有该值,有时它只是null

这是线程问题还是只是VisualStudio的bug


环境:Windows 10、VS 2019、.NET 5.0、Windows窗体应用程序

断点的精确位置很重要。如果您只是中断该行,则ex将为null。如果您将catch块的左大括号作为断点,ex将有一个值。您还可以跨过线断点进入大括号以获取值

这是开口大括号上的断点

这是“行”上的断点

这对您有帮助吗?尝试放置
控制台。WriteLine(ex)在catch块内。我敢肯定,如果它真的进入捕获状态,它不是空的-block@Xerillio:如果我在catch中放入Debug.WriteLine(ex.Message)语句,则会显示该消息,并且变量“ex”不为null。但是我仍然想知道为什么在第一种情况下VS将ex显示为null,尽管异常被正确捕获。这是一个bug吗?@a.B.如果我没记错的话,因为catch块中没有语句,调试器从来没有真正进入该代码块的作用域,所以该作用域的变量不会被扩展。这是一个很好的提醒,以避免吞咽空代码块的异常-这是一个糟糕的做法。