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

时间:2016-04-05 14:01:30

标签: c# c#-6.0 .net-native

当我使用.NET Native编译器编译UWP应用程序并启用代码优化(实质上是发布模式)时,当我尝试访问catch块中的实际异常时,我得到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) { }

代码示例:

NullReferenceException

它进入正确的catch块,并在我访问ex时抛出container view。只有在.Net Native和代码优化都启用时,这才会失败。

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

2 个答案:

答案 0 :(得分:5)

我不确定为什么会出现问题(现在已经调试了很长时间),但缺少await让我很好奇。

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

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

虽然没有await的代码块失败了。不确定这是一个错误还是你应该修复的东西......

答案 1 :(得分:2)

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

这是我们编译器中的一个错误。您可以将每个异常处理区域(try,catch,finally,when)视为一个小函数或“funclet”。在为“when”(也就是过滤器块)设置堆栈时,我们会丢失异常对象的跟踪。 Windows工具1.3中已更正此错误,如果没有重大挫折,则应在另一周或两周内发布。它将显示为已安装VS 2015 Update 2的人员的更新。

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