C# 异步try catch-异常变量为null
本代码仅用于学习/测试目的: 我故意在任务中引发异常。运行(…)并从WindowsForm按钮调用它Clickeventhandler: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");
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块中没有语句,调试器从来没有真正进入该代码块的作用域,所以该作用域的变量不会被扩展。这是一个很好的提醒,以避免吞咽空代码块的异常-这是一个糟糕的做法。