Как сделать код исключения 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);
}