如何抓住';任何';C+中的例外情况+;? P> >我的理解是C++中的所有异常最终扩展为异常< /代码>。在Java世界中,捕获异常e无论异常的类型如何,都是有效的。在C++中如何做到这一点?

如何抓住';任何';C+中的例外情况+;? P> >我的理解是C++中的所有异常最终扩展为异常< /代码>。在Java世界中,捕获异常e无论异常的类型如何,都是有效的。在C++中如何做到这一点?,c++,exception,C++,Exception,为什么在这个代码段中没有捕获异常 try{ int z = 34/0; cout << "This line should not appear" << endl; } catch (exception e) { cout << "An error has occurred: " << e.what(); // Not executed } 试试{ int z=34/0; 库特 为什么在此代码段中未捕获异

为什么在这个代码段中没有捕获异常

try{        
    int z = 34/0;
    cout << "This line should not appear" << endl;
} catch (exception e) {
    cout << "An error has occurred: " << e.what();  // Not executed
}
试试{
int z=34/0;
库特
为什么在此代码段中未捕获异常?

一个整数除以<代码> 0 >代码>不是标准C++异常。因此,在这种情况下不抛出任何异常,即得到的是一个普通的<强>未定义的行为< /强>

某些特定的编译器可能会将此场景映射到特定的异常,您必须检查编译器文档才能找到相同的异常。但是,使用此功能将是不可移植的,并且您的代码将仅限于特定的编译器

在这种情况下,您最好自己检查错误条件(除数等于零),并显式抛出异常

< > >在C++中,如何找出什么行为引起什么异常?< /强>


std::exception
类提供了一个方法
std::exception::what()< /p> >具体地说。

除零不会在C++中引发异常。参见,例如,

< P>除以0,大多数CPU遵循某种升级过程,这可能被称为异常,信号,中断,陷阱或任何在CPU制造商的行话中的任何一种。即使没有“例外”一词,也不会有任何异常。也使用了——与C++语言异常有任何直接关系。 在C++中,由于CPU周期和对象代码大小通常要花费很高的代价才能重复测试,所以不必为内置类型的编译器生成代码进行任何此类检查。实际上,通常相信程序员将编码以避免分界,在子集中插入显式检查。划分有用的部分;分解这些检查以避免冗余

如果程序员想要一个一致的保证检查,他们可以创建一个用户定义的类型(带有自定义重载运算符的类),该类型可以用来代替内置的数字类型,但需要花时间检查是否被零除(或下溢、溢出或开发人员关心的任何其他问题)我认为像JAVA和C#这样的语言缺少运算符重载,我想这意味着它们不能以这种方式轻松地替换内置类型,需要有侵入性的代码更改来显式调用函数,而不是使用直观的数学运算符

无论如何,由于C++标准本身没有指定分频情况下的一些行为,如果它选择,则实现可以提供一些潜在有用的行为。这可能包括某种方式生成实际的C++语言异常,但实际上在CPU周期和代码大小上可能太贵了。也许JAVA是如此的缓慢和臃肿以至于像这样的额外检查既不存在也不存在…?;-)

假设您使用的是x86系列CPU,0除法通知的术语是“中断”。但是,如果该机器运行UNIX或Linux,则除法会在操作系统级别产生一个“信号”,您可以设置一个信号处理程序来获取问题通知。

您编写

<> P> >我的理解是C++中的所有异常最终扩展<代码>异常< /代码>

<>这是错误的。C++异常可以是大多数类型。用C++ 98必须是可复制的,但是可能(并且最有可能)限制已经用C++ 11解除了。 世界中,捕获异常E将工作,不管C++的异常类型如何。 通过一项全面条款

catch(…)

这样做的主要问题是,如果您需要有关异常的任何信息,那么在C++98中,您必须重新调用,这不是一种特别有效的方法。而且,从2012年起,您的工具链可能还不支持C++11的异常处理功能

为什么在这个代码段中没有捕获异常

try{        
    int z = 34/0;
    cout << "This line should not appear" << endl;
} catch (exception e) {
    cout << "An error has occurred: " << e.what();  // Not executed
}

因为没有C++异常。通常编译器会拒绝编译常量表达式<代码> 34/0 <代码>。我不能想到任何除g++之外的编译它的编译器:<强>你编译了那个代码吗?< /强> ./p>


无论如何,如果一个人管理编译代码,那么从标准C++的观点来看,它只会导致<强>未定义行为>,在那里什么也不会发生。如果你幸运的话,你会得到一个<代码>信号<代码>,但是没有什么保证。但是,可以使用特定于平台的功能来捕捉这样的EVE。nts.

在旁注中,捕获
异常
会捕获任何其他异常吗?@JamesLeonard仅当这些异常是
std::exception
的子类时。要捕获所有异常,只需使用
catch(…)
。看。好的。谢谢。和Java一样。@JamesLeonard:你应该只检查一些东西是否与Java相匹配作为好奇心。这两种语言是不同的,所以你应该在学习时假装不懂Java;任何相似之处都只是巧合,甚至可能只是表面上看起来相似。@JamesLeonard:另外,请注意使用捕获所有
catch(…)
通常是一种不好的做法。它只是隐藏程序中的错误,您应该避免使用它。相反,您应该只捕获特定的异常并修复可能导致抛出意外异常的错误。顺便说一句,当存在异常时,即使是从
std::exception
派生的异常,这仍然不起作用你需要捕获一个引用,这样多态性才能正常发生:你的代码捕获一个副本,被截断到基类
异常