Visual Studio не удалось определить путь возврата кода - PullRequest
0 голосов
/ 21 сентября 2011

Я испытал при рефакторинге некоторого кода, может быть, я слепой, но не смог понять, почему следующий код не будет работать.

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 ]

1 голос
/ 21 сентября 2011

Вы могли бы потенциально изменить его на ...

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
}
1 голос
/ 21 сентября 2011

Компилятор не принимает во внимание, что ваш метод LogAndThrow() всегда будет генерировать исключение - в этом случае все пути кода в Foo() должны возвращать логическое значение, поэтому вы могли бы просто сделатьэто:

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

В общем, так как вы все равно бросаете, я бы рекомендовал использовать блок try/catch в одном центральном месте в вашем приложении для регистрации, то есть на самом высоком уровне , если выможет действительно обработать исключение - это не похоже, что вы здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...