我不得不在一个项目中使用C,我正在考虑使用longjmp/setjmp
进行错误处理,因为我认为在一个中心位置处理错误将比返回代码容易得多。如果有一些关于如何做到这一点的线索,我将不胜感激。
我特别关心的是,如果发生任何这样的错误,资源清理是否被正确完成。
另外,如何处理导致多线程程序使用它们的错误?
更好的是,是否已经存在一些用于错误/异常处理的C库?
发布于 2009-05-04 15:12:11
发布于 2009-05-04 17:44:24
如果您担心资源清理,那么您必须认真考虑longjmp()和setjmp()是否是一个好主意。
如果您设计您的资源分配系统,以便您实际上可以准确地清理,那么它是可以的-但是,如果您的代码所使用的标准库实际上分配了必须释放的资源,那么这种设计往往是棘手的,而且通常是不完整的。它需要格外小心,而且因为它并不完全可靠,所以不适合可能需要多次使用setjmp()/longjmp()调用(它们会泄漏、扩展并最终导致问题)的长时间运行的系统。
发布于 2009-05-04 12:35:43
Symbian用longjmp()
实现了它的Leave
机制,这是你需要做的所有事情的一个很好的演练。
Symbian有一个全局的“清理堆栈”,如果发生跳跃,你可以推送和弹出你想要清理的东西。这是在抛出C++异常时C++编译器自动展开堆栈的手动替代方法。
Symbian有“陷阱工具”可以跳出来;它们可以嵌套在一起。
(塞班最近在C++异常方面重新实现了它,但接口保持不变)。
总而言之,我认为适当的C++异常不太容易出现编码错误,而且比使用自己的C等效物要快得多。
(例如,当异常不被抛出时,现代C++编译器非常擅长“零开销”异常;longjmp()
必须存储所有寄存器的状态,即使后来没有进行跳转,因此从根本上讲永远不会像异常那样快。)
使用C++作为更好的C语言,因为您只采用异常和RAII,如果使用longjmp()
进行异常模拟对您很有吸引力,这将是一个很好的方法。
https://stackoverflow.com/questions/819864
复制相似问题