Axpection_ptr在All Handler中的奇特在CentOS 7和Windows上都奇怪地工作

exception_ptr in a catch-all handler works oddly on both Centos 7 and Windows

本文关键字:Windows 工作 All ptr Handler Axpection CentOS      更新时间:2023-10-16

为了避免以书面形式处理代码堆叠捕获块,我想尝试使用C 11个功能来编写一个catch allection Handler。在这样做的过程中,我注意到了一些奇怪的行为,这些行为在CentOS 7和Windows 7和Windows 7和8.1上都使用Code :: blocks IDE在两个系统上都使用(您必须检查设置 -> Compiler-> C 11 ISO复选框至我有两种例外,硬件划分为零(number1/number2) ,零函数的合成划分 setient(number1,number2)有零分母时,这会引起声明的异常。这是代码:

#include <iostream>
#include <exception>
#include <typeinfo>
#include <stdexcept>
using namespace std;
class DivideByZero : public runtime_error
{
public:
    DivideByZero() :
        runtime_error("Divide by zero exception") {}
};
template <typename T>
T quotient(T numer, T denom)
{
    if (denom == 0)
    {
        throw DivideByZero();
    }
    else
    {
        return numer / denom;
    }
}
int main()
{
    double number1, number2, ratio;
    cout << "Enter a numerator: ";
    cin >> number1;
    cout << "Enter a denominator: ";
    cin >> number2;
    try
    {
        ratio = number1/number2;
        //ratio = quotient(number1, number2);
        cout << "Result is: " << ratio << endl;
    }
    catch (...)
    {
        std::exception_ptr p = std::current_exception();
        cerr << "Exception: "
             << (p ?
                 p.__cxa_exception_type()->name() :
                 "Anonymous")
             << endl;
    }
    return 0;
}

我会评论硬件或综合分区代码行,然后使用不同的整数和实际类型构建/运行。

对于i5和i7英特尔处理器,CentOS 7和Windows系统的结果相似。

执行在所有系统上抛出声明异常的合成鸿沟(商)行时,它以相同的方式对所有整数和真实类型进行了相同的工作方式,正确打印出异常编号,并向cerr宣布的例外文本:

Exception: 12DivideByZero

非常好,不再堆叠异常,并且缺少可能发生的任何例外!

但是,当对整数和实际类型执行硬件分隔线(number1/number2)时,例外处理以不同的方式绕过。对于诸如double之类的真实类型,捕获了例外,并且未打印cerr文本,出现的是在代码后打印的显示行,导致例外,,您不应该看到,以及看起来似乎是什么。成为所有实际类型的无限价值:

Result is: inf

对于所有您甚至没有得到的整数类型,您都没有显示显示行,并且在Linux上正常结束,在Windows上它死去并寻找解决方案的解决方案。

对我来说似乎很奇怪,我敢肯定,有些人会解释C 中的例外处理缺乏一致性。

两个Windows系统上的代码::块都使用了Mingw32-G 。EXE的最新下载进行编译,当然,CentOS 7使用的是64位G 编译器。并不是说这有任何不同,系统的行为也相似。

[expr.mul]/4 二进制/操作员产生商,二进制%操作员在第二个表达式下产生其余部分。如果/%的第二操作数为零,则行为是未定义的...

number2输入零时,您的程序将表现出未定义的行为。这意味着任何结果都是可能的;C 标准对此类程序的行为没有任何要求。

相关文章: