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

时间:2011-09-21 02:16:24

标签: c# visual-studio-2010 exception

我在重构一些代码时经历过,也许我是盲目但我没看到为什么下面的代码不起作用。

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;
}

代码现在不编译。

2 个答案:

答案 0 :(得分:1)

编译器没有考虑到你的LogAndThrow()方法总是会抛出异常 - 在Foo()中的所有代码路径都必须返回一个布尔值,所以你可以< / em>就这样做:

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

一般情况下,无论如何,我建议您在应用中的单个中心位置使用try/catch块进行日志记录,即在最高级别,除非您可以真正处理异常 - 看起来你不在这里。

答案 1 :(得分:1)

您可以将其更改为...

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
}