C++ C++/GCC:如何在编译时检测未处理的异常

C++ C++/GCC:如何在编译时检测未处理的异常,c++,gcc,exception-handling,C++,Gcc,Exception Handling,简介: 在Java中,如果您没有捕获异常,您的代码甚至不会编译,并且编译器会在未处理的异常上崩溃 问题: 在这种情况下,有没有办法告诉GCC要像Java一样“严格”,并在未处理的异常上发出错误或至少警告 如果不是-是否有IDE(Unix,请)可以突出这些情况作为警告?< P>唯一保证您可以启用C++功能的是它从不抛出异常: void f() noexcept; 但是,当抛出异常时,这将在运行时终止程序。它在编译时未被验证 如果您想保证处理错误,最接近的是返回一个类型的值,该值封装了一个类型的值

简介: 在Java中,如果您没有捕获异常,您的代码甚至不会编译,并且编译器会在未处理的异常上崩溃

问题: 在这种情况下,有没有办法告诉GCC要像Java一样“严格”,并在未处理的异常上发出错误或至少警告


如果不是-是否有IDE(Unix,请)可以突出这些情况作为警告?

< P>唯一保证您可以启用C++功能的是它从不抛出异常:

void f() noexcept;
但是,当抛出异常时,这将在运行时终止程序。它在编译时未被验证


如果您想保证处理错误,最接近的是返回一个类型的值,该值封装了一个类型的值:Boost::变量< /C>。成员函数需要两个回调:一个代码返回:<代码> OK >代码>一个实例,一个代码<错误> /Cuff>案例。

< P> > C++中不可能。异常规范是函数声明的一部分,但不是其类型的一部分。任何间接调用(通过指针或虚拟调用)都会完全清除有关异常的任何信息

异常规范在C++11中被弃用,取而代之的是
noexcept
,因此任何编译器都不可能费心增强此语言功能。

您可以始终使用:

int main()
{
   try {
      ... your usual main ... 
   }
   catch(...)
   {
       std::cerr << "Unhandled exception caught" << std::endl;
   }
}
intmain()
{
试一试{
…你通常的主要。。。
}
捕获(…)
{

首先,您关于Java的陈述是错误的;只是确定的 异常类型会阻止代码编译。对于 大多数情况下,这些类型的异常对应于 通过返回码更好地处理。异常通常是 当错误通过网络传播时,只有适当的解决方案 大量的函数,您不想添加 所有这些函数的异常规范

这就是Java之所以与众不同的真正原因:异常 派生自
java.lang.Error
通常应为 (C++中的断言失败等);以及 派生自
java.lang.RuntimeException
中应为异常 C++中也没有检查过java,因为它不是 让每个函数声明它可能抛出 其中一个

至于其余的,您希望捕获的异常 在调用代码中,通常最好立即处理它们 通过返回代码,而不是异常;Java可以使用异常 这里是因为它没有out参数,可以使用 返回代码更为尴尬。当然,在C++中,你也可以。 默认忽略返回代码,这是一个缺点(但是 但真正的问题是合同, 这比函数f可能抛出/返回x要复杂得多; 更像是“函数f将抛出/返回x, 如果条件c满足”,我不知道有哪种语言 一种在C++中执行该方法的方法(以及用于检查异常)。 在Java中,异常规范更符合 “函数f只会抛出x”,这通常是 不是很有用,除非“x”表示所有例外 写真正健壮的代码,你需要一些 保证永远不会扔。有趣的是,你可以 在C++中指定这一点,既有前C ++ 11(<代码>()) (
noexcept
);不能在Java中使用,因为不能指定它 函数不会抛出
java.lang.RuntimeError

(或者一个
java.lang.Error
,但问题不大,因为如果 如果你得到了其中一个,你的申请不管怎么说都被冲洗了。只是 你希望如何从中恢复
java.lang.VirtualMachineError
?当然,你不能 确实希望能够从中的段冲突中恢复 C++也可以。虽然…代码> java .Lang.OutOfMyMyRebug < /Cord>派生 来自
java.lang.VirtualMachineError
;虽然不容易,但也不容易 总是适用的,我写了C++代码,成功地
std::bad_alloc
)恢复

因为任何函数都可以在没有正式规范的情况下引发异常,这是不可能的。记住“崩溃”(如分段错误)也不是可以用C++ <代码> catch > /Cord>语句捕获的异常,它们也可以在任何地方发生。我同意分割错误。我只是想避免在抛出和未处理的异常上发生突然崩溃。我想知道所有可以引发异常的调用,并处理它们的默认行为。nhandled exceptions是调用
std::terminate
。可以安装自定义处理程序。它可能无法解决您眼前的问题,但可以让您的应用程序最后一次“查看”未处理的异常。我不是GCC或Unix专家。也许可以像在windows上一样,为每个进程/线程注册某种异常处理程序(SEH,VEH)。在windows上,您可以使用这些处理程序捕获每种类型的异常。如果unix上存在类似的情况,这可能是您的方式。但我不知道搜索的条件是什么。我想抛出异常并处理它们,因为它支持提供信息的调试消息,因此
noexcept
不是我的选项{ OK,Error } Stutt是我在 perl < /C>中常用的一种解决方案,但我认为C++中我可以有效地使用例外机制。如果我没有CousEI在C++ 11中的哪个功能被取消了,我可以使用这个解决方案。