Как сделать код исключения DRY?

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

Есть ли лучший способ повторно выразить код ниже? Я подозреваю, что здесь можно использовать макросы, но я обычно избегаю таких макросов, как чума.

  try {
   // Code here...
  }
  catch (std::exception & e)
  {
    ErrorMsgLog::Log("Error", "std exception caught in " __func__ " " __FILE__ " " __LINE__, e.what());
    throw e;
  }
  catch (Exception & e)
  {
    ErrorMsgLog::Log("Error", "Builder exception caught in " __func__ " " __FILE__ " " __LINE__, e.Message);
    throw e;
  }
  catch (...)
  {
    ErrorMsgLog::Log("Error", "Unknown exception caught in " __func__ " " __FILE__ " " __LINE__);
    throw std::runtime_error ("Unknown Exception in " __func__ " " __FILE__ " " __LINE__);
  }

1 ответ

Лучший способ реализовать это, вероятно, с помощью макросов. Определение макроса немного уродливо, но вызов макроса будет довольно простым, и вам не нужно будет реорганизовывать свой код. Вот пример, который показывает, как вы могли бы это реализовать:

#define RUN_SAFE(code) try {\
    code\
  }\
  catch (std::exception & e)\
  {\
    ErrorMsgLog::Log("Error");\
    throw e;\
  }\
  catch (Exception & e)\
  {\
    ErrorMsgLog::Log("Error");\
    throw e;\
  }\
  catch (...)\
  {\
    ErrorMsgLog::Log("Error");\
    throw std::exception();\
  }\

int main(){
  RUN_SAFE(
    cout << "Hello World\n";
  )
}

Если вы действительно непреклонны в том, что не используете макросы, вы можете использовать подход, предложенный juanchopanza, и использовать функцию более высокого порядка для проверки, которая принимает код в качестве параметра. Этот подход, вероятно, потребует от вас небольшого рефакторинга кода. Вот как вы можете это реализовать:

void helloWorld(){
  cout << "Hello World\n";
}

void runSafe(void (*func)()){
  try {
      func();
    }
    catch (std::exception & e)
    {
      ErrorMsgLog::Log("Error");
      throw e;
    }
    catch (Exception & e)
    {
      ErrorMsgLog::Log("Error");
      throw e;
    }
    catch (...)
    {
      ErrorMsgLog::Log("Error");
      throw std::exception();
    }
}

int main(){
  runSafe(helloWorld);
}
Другие вопросы по тегам