2016-11-15 73 views
0

我有一个旧的基于C的项目,我想从Atmel处理器移植到Raspberry Pi。如何在C++异常处理中包装我的C代码?

在编写它的时候,C++不是一个选项,而且将它全部转换为C++会花费太多精力,几乎是一次重写。

一些问题/崩溃不能(容易)被C抓住,所以有时候我的程序会死掉&我希望在失效前发出最后的求救声。没有尝试恢复,我甚至可以生活没有错误的细节,只要我得到一个消息告诉我访问设备

长话短说,我认为如果我有例外,我可以有更好的错误检测处理。

我在考虑使用异常处理作为提醒我去设备并获取完整错误日志,重置硬件等等的机会。如果我的C不会总是给我最后的喘息机会,代码变得很大

因为我不想做一个完整的C++重写,是否仅仅将main()换成try/catch

技术上是否足够,还是我需要做更多?

除了更详细的错误报告,有没有什么可以通过将每个(主要)功能包装在它自己的try/catch

+2

异常由'throw'语句抛出。 Seg错误不需要抛出异常;他们是未定义行为的症状。 –

+1

分段错误不保证被try/catch(...)捕获。 实际上,即使您指定了C样式处理程序,也不应在分段错误后继续。 我建议你只需在每个C函数周围添加try/catch,并进行广泛的日志记录并希望获得最佳效果! – Rami

+0

请忘记我曾经说过seg故障(但是+1,两者);这是一个不好的例子,我将它从问题中删除(我检查NULL参数,但可能不会在每次解除引用前检查NULL)。但是,@PeteBecker,异常不会从'throw'中产生,这就是我想要赶上的 – Mawg

回答

1

除了更详细的错误报告,有没有什么可以通过将每个(主要)函数包装在自己的try/catch中获得?

首先,只有抓到你在哪里,在一个位置的异常改变程序的行为响应他们(除非你只是希望通过std::throw_with_nested()添加更多的上下文信息)

其次,AC程序不会显示RAII,所以在这种情况下抛出异常很可能会泄漏资源,除非您将所有的句柄和内存分配包含在智能指针或启用RAII的句柄类中。

你应该这样做,然后再考虑添加异常处理。

如果程序可能会在未来积极维护,那么这样做可能会有里程。如果不是,可能最好留下睡觉的狗躺下。

+0

有一些好点(+1),但正如我所说的,我只是想要一个最后一次发送HTPP或TCP消息的机会,或者SMS或电子邮件。基本上,不只是*** *** ***,而是给予最后的喘息,然后死亡 – Mawg

+1

你最好的选择可能是一个信号处理程序(在类Unix系统上)或窗口上的结构化异常处理。 –

+0

哇!信号处理程序很好!我怎么错过了?因为这个原因,刚刚完成了信号处理工作。随意发布作为(其他)答案 – Mawg