【问题标题】:Code in filtered exception handler throws NullReferenceException when accessing exception过滤异常处理程序中的代码在访问异常时抛出 NullReferenceException
【发布时间】:2016-04-05 14:01:30
【问题描述】:

当我使用 .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 和代码优化都打开时才会失败。

是什么导致了这个问题?

【问题讨论】:

  • @Pan 为什么要删除标签?它似乎与这种构建模式有关,因此可能是 .NET native 的编译器问题。
  • 因为它们无关紧要。 exc.Message 为空。这是一个普通的 NulLReferenceException。 OP调用了只接受参数名的构造函数
  • 不,它不是...消息是默认的。请自行尝试此代码。
  • 是的,这不是一个普通的 NRE... 异常可以在它上面的行上很好地取消引用。
  • “异常可以在其上方的行中很好地取消引用” - 是的,不是的,异常过滤器并不是那么简单。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗯,这对我也有用!我没有意识到它与异步/等待有关。我在其中找到的实际代码并不是按设计等待特定结果(无论如何它都在 ICommands 中,因此它们将是异步无效的)。我认为无论如何都不应该要求您等待,对吧?
  • 是的,每个async 都应该是awaited。
  • 这是一项长期运行的任务,之后我不需要安排继续。我想要这里的即发即弃行为。等待它不是一个真正的选择。
  • 我又做了一些测试,毕竟这看起来与 async/await 无关。
  • 你能告诉我们你发现了什么吗?
【解决方案2】:

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

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

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

【讨论】:

  • 感谢@Matt!我在 3 个场景中看到了稍微不同的行为:非异步、异步但未等待和异步 + 等待。更新出来后,我会尝试所有 3 个。
  • 优秀。请告诉我们进展如何。我们喜欢通过 dotnetnative@microsoft.com 听取人们的意见。
猜你喜欢
  • 2011-12-12
  • 2013-07-24
  • 2021-10-21
  • 2013-09-22
  • 2012-03-30
  • 2021-05-19
  • 2015-12-12
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多