相关疑难解决方法(0)

新的"异常过滤器"功能提供了哪些好处?

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)

在大括号之前进行过滤是一件大事吗?也许与性能或安全性有关?

c# exception-handling exception c#-6.0

32
推荐指数
5
解决办法
5302
查看次数

使用异常过滤器进行日志记录时如何避免“并非所有代码路径都返回值”

注意:这是一个关于在使用异常过滤器进行日志记录时是否有最佳实践/惯用方法来避免特定编译器问题的问题。这个问题已经提到了两种不同的方法,以及每种方法的问题。如果可能,我正在寻找更好的方法。

我正在使用带有日志记录方法的异常过滤器,该方法总是返回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;

c# logging exception

-5
推荐指数
1
解决办法
98
查看次数

标签 统计

c# ×2

exception ×2

c#-6.0 ×1

exception-handling ×1

logging ×1