我正在尝试使用异常catch-rethrows来调试我的应用程序。我的异常处理代码比我正在调试的一些块长,而且它都是复制粘贴的。
有没有更好的方法来反复表达以下代码?我怀疑宏是这里的方式,但我通常会避免像瘟疫这样的宏。
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__);
}
答案 0 :(得分:0)
实现这一点的最佳方法可能是使用宏。宏定义有点难看,但调用宏将非常简单,您不需要重新组织代码。这是一个展示如何实现它的示例:
#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);
}