Visual studio检测代码返回路径失败

本文关键字:返回路径 失败 代码 检测 studio Visual | 更新日期: 2023-09-27 18:09:06

我在重构一些代码时遇到的问题,也许我是盲目的,但我没能看到为什么下面的代码不能工作。

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

代码现在无法编译

Visual studio检测代码返回路径失败

你可以把它改成…

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更改为:

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

编译器没有考虑到你的LogAndThrow()方法总是会抛出一个异常——在这种情况下,Foo()中的所有代码路径必须返回一个布尔值,所以你可以只需这样做:

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

在一般情况下,因为你抛出无论如何,我建议使用try/catch块在一个单一的中心点在你的应用程序的日志记录,即在最高级别,除非你可以真正处理异常-它看起来不像你在这里。