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

Erg*_*wun -5 c# logging exception

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

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

AAA*_*ddd 5

答案是否定的,您必须通过 a或返回结果来满足编译器的静态分析throw

你不能关闭它(我知道),或者通过pragma禁用错误。

我认为您处于这种情况是因为滥用语言功能。编译器完全期望条件的一个when是一个表达该(可以或可以不)导致true。此外,考虑到静态分析的限制,编译器反过来期望结果块是一个有效的分支(即使你已经将它硬连线关闭),并认为它应该是一个编译错误

我会重新考虑您的设计,使其在没有副作用的情况下是可预测的,如果您确实需要这样做,请使用注释和 athrow返回结果的组合(如建议的那样)。