最近我在C ++中尝试了一个简单的异常程序,如下所示: -
#include <iostream>
#include <exception>
#include <stdexcept>
using namespace std;
int main()
{
int x=5, y=0;
try
{
int z=x/y;
cout<<"z="<<z;
}
catch (exception& e)
{
cout<<"exception caught: "<<e.what();
}
return 0;
}
为什么这里没有例外?代码有什么问题?
另外我想知道为什么&
需要捕获异常?
答案 0 :(得分:10)
除以零时的任何整数在标准C ++中都不是例外。
C ++第5.6节规定:
如果/或%的第二个操作数为零,则行为未定义。
你可能也会觉得这很有趣:
Stroustrup在&#34; C ++的设计和演变&#34; (Addison Wesley, 1994),&#34;低级事件,例如算术溢出和除以 零,假定由专用的低级机制处理 而不是例外。这使C ++能够匹配行为 算术时的其他语言。它也避免了 事件发生在严重流水线架构上的问题 例如除以零是异步的。&#34;`
答案 1 :(得分:3)
关于第二个问题:
我们通过引用(&amp;)捕获异常,因为多态类型只能通过指针或引用“多态化”。例外是多态类型,因为我们可以有多个派生自std::exception
的类,我们想要一般地捕获它们。
由于按惯例,我们按值抛出异常,因此只有引用可以在catch站点上运行。
答案 2 :(得分:2)
在C ++中,除以零是未定义的行为 - 它不会抛出异常。
从最近的C ++标准工作草案(第5章,表达式)开始,关于未经数学定义的表达式:
如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。
答案 3 :(得分:2)
您的代码中没有抛出异常,也没有异常被捕获。
如果y == 0
可以抛出异常并在catch块中捕获它:
try
{
if (y == 0) throw(string("Divide by zero not allowed"));
int z=x/y;
cout<<"z="<<z;
}
catch (const string &e)
{
cout << "exception caught: "<< e;
}
我们不需要通过引用来捕获异常,但它是首选。
由于我们正在抛出一个字符串,我们也需要捕获一个字符串。
我们也可以抛出一个字符串文字并抓住它:
try
{
if (y == 0) throw("Divide by zero not allowed");
int z=x/y;
cout<<"z="<<z;
}
catch (const char* e)
{
cout << "exception caught: "<< e;
}
答案 4 :(得分:0)
在C ++中未定义除以0,所以你所能做的就是抛出并捕获异常: -
int main()
{
int x=5, y=0, z=1;
try
{
if (y==0)
throw y;
else
z=x/y;
cout<<z;
}
catch (int)
{
cout<<"division by zero error";
}
return 0;
}