所以,我有一个很大的遗留软件,用C语言编写。它适用于嵌入式系统,所以如果出现问题,比如除零,空指针取消引用等,除了重启之外没什么可做的。 / p>
我想知道我是否可以将main()实现为c ++并将其内容包装在try / catch中。这样,根据抛出的异常类型,我可以在重启之前记录一些调试信息。
嗯,因为我可能需要包装多个进程,而不仅仅是main(),但我希望你能看到我的意思......
是否值得将现有的C代码(几个100 Klocs)保持不变,除了用try / catch包装它?
答案 0 :(得分:10)
除零或空指针解除引用除法不会产生异常(使用C ++术语)。 C甚至没有例外的概念。如果您使用的是类UNIX系统,则可能需要安装信号处理程序(SIGFPE
,SIGSEGV
等)。
答案 1 :(得分:4)
由于它是一个嵌入式应用程序,它可能只在一个平台上运行。
如果是这样的话,为零除以及其他硬异常安装适当的中断处理程序/内核陷阱处理程序可能会更简单,更少干扰。
在大多数情况下,只需几行代码就可以完成。检查操作系统是否支持此类可安装的异常处理程序。如果您正在使用无OS系统,则可以直接挂接在异常期间调用的CPU中断。
答案 2 :(得分:4)
首先,除以零或空指针取消引用不会抛出异常。 Fpe异常在带有信号的GNU C库中实现(SIGFPE)。并且是C99标准的一部分,而不是C ++标准。
根据我在嵌入式C和C ++开发方面的经验提供了一些提示。取决于您的嵌入式操作系统:
答案 3 :(得分:3)
我不认为从C编译的机器代码在异常方面做同样的事情,因为为C ++编译的机器代码“知道”异常。也就是说,我不认为能够使用C ++构造从C代码中捕获“异常”是正确的。 C不会抛出异常,并且没有什么可以保证C代码执行错误时发生的错误会被C ++的异常机制捕获。
答案 4 :(得分:1)
除以零,空指针取消引用不是C或C ++异常,它们是硬件异常。
在Windows上,如果使用_set_se_translator(),您可以获得包含在普通C ++异常中的硬件异常。
__ try / __ catch也可能有所帮助。在MSDN上查找__try / __ catch,GetExceptionCode(),_ set_se_translator(),您可能会找到所需内容。
答案 5 :(得分:0)
我想我记得研究过如何处理SIGSEGV
(通常在解析无效指针时生成,或除以0),我在网上发现的一般建议是:什么都不做,让程序死掉。我认为正确的解释是,当你到达一个SIGSEGV陷阱时,有问题的线程的堆栈被破坏而无法修复。
如果这是真的,有人会评论吗?
答案 6 :(得分:0)
仅适用于msvc
__try { int p = 0; p=p / 0; } __except (1) { printf("Division by 0 \n"); }