【发布时间】:2010-05-20 02:42:30
【问题描述】:
假设我有一个在某些机器上运行 24x7 的库。即使代码坚如磐石,硬件故障也迟早会触发异常。我想为这样的事件设置某种故障保护装置。一种方法是编写封装每个 api a 的包装函数:
returnCode=DEFAULT;
try
{
returnCode=libraryAPI1();
}
catch(...)
{
returnCode=BAD;
}
return returnCode;
库的调用者然后重新启动整个线程,如果 returnCode 错误则重新初始化模块。
事情可能会大错特错。例如
如果 try 块(或 libraryAPI1())有:
func1();
char *x=malloc(1000);
func2();
如果 func2() 抛出异常,x 将永远不会被释放。同样,文件损坏也是一种可能的结果。
您能告诉我在这种情况下还有哪些可能出错的地方吗?
【问题讨论】:
-
关于示例,这正是RAII 解决的问题。
-
我对类似情况的“解决方案”(一个 24/7 运行的守护程序)只是让一个 cron 作业每 2 分钟检查一次以确保守护程序仍在运行,并在必要时重新启动它.当抛出一个罕见的异常时,让守护进程死掉并在几分钟后重新启动通常没什么大不了的。
-
如果您认为“硬件故障可能导致此代码中断”,那么您认为可以编写代码来修复它的原因是什么?您的恢复代码也会受到影响。
-
阅读这篇文章:stackoverflow.com/questions/161177/… 以了解为什么 finally 是由 RAII 解决的糟糕的语言设计
标签: c++ anti-patterns