C# visual studio无法检测代码返回路径

C# visual studio无法检测代码返回路径,c#,visual-studio-2010,exception,C#,Visual Studio 2010,Exception,当重构一些代码时,我经历了一段时间,也许我是瞎子,但我不明白为什么下面的代码不能工作 public bool Foo() { try { return SomeFunctionMightThrow(); } catch (Exception ex) { Logger.log(ex); throw ex; } } 到目前为止还不错,如果我重构代码 public bool Foo() { try

当重构一些代码时,我经历了一段时间,也许我是瞎子,但我不明白为什么下面的代码不能工作

public bool Foo()
{
    try
    {
        return SomeFunctionMightThrow();
    }
    catch (Exception ex)
    {
        Logger.log(ex);
        throw ex;
    }
}
到目前为止还不错,如果我重构代码

public bool Foo()
{
  try
  {
    return SomeFunctionMightThrow();
  }
  catch (Exception ex)
  {
    LogAndThrow(ex);
  }
}

private void LogAndThrow(Exception ex)
{
  Logger.log(ex);
  throw ex;
}

代码现在不编译。

编译器没有考虑到您的loganthrow()方法总是会抛出异常-在这种情况下,Foo()中的所有代码路径都必须返回布尔值,因此您可以执行以下操作:

public bool Foo()
{
  try
  {
    return SomeFunctionMightThrow();
  }
  catch (Exception ex)
  {
    LogAndThrow(ex);
    return false; //will never get here
  }
}

总的来说,既然你无论如何都会抛出,我建议在你的应用程序中的一个中心点使用
try/catch
块进行日志记录,即在最高级别,除非你真的可以处理异常-看起来你不在这里。

你可能会将其更改为

public bool Foo()
{
  try
  {
    return SomeFunctionMightThrow();
  }
  catch (Exception ex)
  {
    // note: this will reset the exception stack trace
    throw LogAndReturnException(ex);
  }
}

private Exception LogAndReturnException(Exception ex)
{
  Logger.log(ex);
  return ex;
}
这本质上就是您想要的,但是提供了VS代码返回路径

或者,对于保留堆栈跟踪的更简单的方法,只需将捕获更改为:

catch (Exception ex)
{
  Log(ex);
  throw; // retains stack trace
}

我假设您只是将此作为一个示例,这样您就知道永远不应该使用
throw-ex那样吗?是的,这个例子只是显示VS无法检测代码返回路径。约翰·桑德斯,你现在让我好奇了。我不是一个很有经验的程序员,所以你能详细说明你的评论吗?为什么不应该使用
抛出ex
那样,应该如何使用?@xbonez如果你发现一个捕获的异常,你应该使用throw;(即,没有变量)而不是抛出ex@JohnSaunders+1,我甚至没有想到这一点,我是盲目地从新的SomeOtherException(“出了问题!”,ex)中“简化”代码的;在我看来,死代码是不好的,它会使代码读取器感到困惑,甚至是IDE的错。代码已经被简化,你可以告诉我,只是为了显示我所问的确切问题。@Yuan:问题仍然存在-你不应该在每个方法中触发异常日志记录,在更高的级别上执行一次,在代码中乱扔try/catch块也同样糟糕。你怎么知道我在每个级别都记录异常?为什么Foo()不是我的最高级别?因为
Foo()
返回bool?当然它是从某个地方调用的。如果Foo()在WCF服务类中并由WCF客户端调用呢?谢谢,这就是我想要的。