过滤异常处理程序中的代码在访问异常时抛出 NullReferenceException

Code in filtered exception handler throws NullReferenceException when accessing exception

当我使用 .NET Native 编译器编译 UWP 应用程序并打开代码优化(本质上是发布模式)时,当我尝试访问 catch 块中的实际异常时,我得到一个 NullReferenceException

代码示例:

try
{
    throw new ArgumentNullException("Param");
}
catch (ArgumentNullException ex) when (ex.ParamName == "Param")
{
    ErrorBlock.Text = ex.ParamName; // ErrorBlock is a TextBlock in the xaml
}
catch (Exception)
{
}

它进入正确的 catch 块,并在我访问 ex 时抛出 NullReferenceException。仅当 .Net Native 和代码优化都打开时才会失败。

导致此问题的原因是什么?

我不太确定为什么会出错(现在已经调试了很长时间),但是 await 的缺失让我很好奇。

如果您确实等待 ShowAsync 方法,则代码运行没有问题(显然您需要创建方法 async 如果您尚未这样做):

await new MessageDialog("Argument null exception: " + argEx.Message).ShowAsync();

虽然没有 await 的代码块失败了。不确定这是错误还是您应该修复的问题...

我在 .NET Native 运行时和编译器团队工作。

这是我们编译器中的一个错误。您可以将每个异常处理区域(try、catch、finally、when)视为一个小函数或"funclet"。在为 "when"(又名过滤器块)设置堆栈时,我们失去了对异常对象的跟踪。此错误已在 Windows Tools 1.3 中得到纠正,如果没有重大挫折,应该会在一两周内发布。对于已安装 VS 2015 Update 2 的用户,它将显示为更新。

如果您有任何其他问题,请告诉我。