gpt4 book ai didi

c++ - 如何使异常代码变干?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:44 24 4
gpt4 key购买 nike

我正在尝试使用异常捕获重新抛出来调试我的应用程序。我的异常处理代码比我正在调试的一些 block 要长,而且都是复制粘贴的。

有没有更好的方法来重复表达下面的代码?我怀疑宏是解决问题的方法,但我通常会像瘟疫一样避免使用宏。

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

最佳答案

实现这一点的最佳方法可能是使用宏。宏定义有点难看,但调用宏会很容易,您不需要重新组织代码。下面是一个示例,展示了如何实现它:

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

关于c++ - 如何使异常代码变干?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26430594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com