异常捕获int除以0

时间:2015-06-17 17:06:56

标签: c++ exception

最近我在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;
}

为什么这里没有例外?代码有什么问题? 另外我想知道为什么&需要捕获异常?

5 个答案:

答案 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;
}