Axpection_ptr在All Handler中的奇特在CentOS 7和Windows上都奇怪地工作
exception_ptr in a catch-all handler works oddly on both Centos 7 and Windows
为了避免以书面形式处理代码堆叠捕获块,我想尝试使用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 标准对此类程序的行为没有任何要求。
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- LoadImage 在 Windows 更新后停止工作
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- 名为DLL的C++windows服务程序工作不正常
- Windows 函数 "NetUserChangePassword" 在 Windows 10 下不再工作(在 Windows 7 下工作)
- ImpersonateLoggedOnUser在windows服务中不工作
- Makefile在Linux中工作,但在Windows下不起作用,在子目录中找不到文件
- C++代码在 Linux 上按预期工作,但在 Windows 上则不然
- Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?
- Windows 上的 SDL 2 在音频设备上无法正常工作
- 有没有办法让DisableUserModeCallbackFilter在Windows 10中工作?
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- C++程序使用 mingw 在 Linux 上交叉编译在 MSy2 中工作,但不能直接在 Windows 中工作
- 将Linux打开,读,写,关闭功能以在Windows上工作
- 从2011年开始,必须在2019年开始工作以使此Windows Textbox做出哪些更改
- Git-Bash for Windows 'rm' 是如何工作的?
- 从Windows上的系统工作的服务中获取用户文档文件夹.C++
- strcat 3 char从char []到char *在Windows上工作,但在Cygwin中给出了细分故障