C#6有一个名为"异常过滤"的新功能
语法是这样的:
catch (Win32Exception exception) when (exception.NativeErrorCode == 0x00042)
{
//Do something here
}
Run Code Online (Sandbox Code Playgroud)
我不禁想知道当前的方法有什么好处:
catch (Win32Exception exception)
{
if (exception.NativeErrorCode == 0x00042)
{
//Do something here
}
}
Run Code Online (Sandbox Code Playgroud)
在大括号之前进行过滤是一件大事吗?也许与性能或安全性有关?
注意:这是一个关于在使用异常过滤器进行日志记录时是否有最佳实践/惯用方法来避免特定编译器问题的问题。这个问题已经提到了两种不同的方法,以及每种方法的问题。如果可能,我正在寻找更好的方法。
我正在使用带有日志记录方法的异常过滤器,该方法总是返回false日志但不捕获特定异常:
public string MyMethod()
{
try
{
// Do something.
return "foo";
}
catch (SpecificException ex) when (this.LogException(ex))
{
// Never hit.
}
}
Run Code Online (Sandbox Code Playgroud)
(bool LogException(SpecificException ex)总是返回的地方false。)
编译器不喜欢这个并给我一个错误:CS0161 Not all code paths return a value.
我可以通过throw;在 catch 中添加一个来避免这个错误,但throw实际上永远不会被击中。它最终看起来像一个多余的catch (Exception) { throw; },因此一个粗心的未来开发人员可能会因此删除整个catch。
另一种避免编译器错误的方法是使用一个变量来保存返回值,并将return语句移动到方法的末尾。但是,这将涉及将变量初始化为一个永远不会实际返回的值,并且再次无法像我希望的那样清楚地传达代码的意图。
有没有更好的方法来避免这个编译器错误,更清楚地传达代码永远不会被命中,除了注释和冗余throw;?