过滤异常处理程序中的代码在访问异常时抛出 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 的用户,它将显示为更新。
如果您有任何其他问题,请告诉我。
当我使用 .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 的用户,它将显示为更新。
如果您有任何其他问题,请告诉我。