Visual c++ 整数除零异常为';抓不到
我一直在通读这本书,遇到了异常和错误章节。作者使用了这个例子:Visual c++ 整数除零异常为';抓不到,visual-c++,exception-handling,seh,Visual C++,Exception Handling,Seh,我一直在通读这本书,遇到了异常和错误章节。作者使用了这个例子: int top = 10; int bottom = 0; try { cout << "top divided by bottom = "; cout << (top / bottom) << endl; } catch(...) { cout << "something has gone wrong!" << endl; } 我自己尝试过,收到
int top = 10;
int bottom = 0;
try
{
cout << "top divided by bottom = ";
cout << (top / bottom) << endl;
}
catch(...)
{
cout << "something has gone wrong!" << endl;
}
我自己尝试过,收到了以下错误:
Unhandled exception at 0x0124152d in stuff.exe: 0xC0000094: Integer division by zero.
< P> >“整数除以零在标准C++中不是例外”,但VisualStudio显然在这里抛出异常,虽然没有捕获它。
我尝试将top
和bottom
定义为double
,并收到以下输出:
top divided by bottom = 1.#INF
那么为什么try-catch
块没有捕获整数除以零的异常呢?,所以非C++异常可以被try
-catch
捕获
请注意,如果您这样做,所有异步异常都将转换为同步异常,您确实不想捕获大多数异常。
因此,一般代码不建议使用
另一方面,盲目地捕捉你所能捕捉到的是一个已知的反模式,只捕捉你真正期望和能够处理的东西
请参见此处,了解\utry
-\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。默认值为/EHsc,它不会导致catch(…)捕获这些SEH异常
抓住一切并不是很漂亮。您不希望发生这种情况:
int* p = 0;
try {
int result = *p / 0;
std::cout << result << std::endl;
}
catch (...) {
std::cout << "Division by zero" << std::endl;
}
int*p=0;
试一试{
int结果=*p/0;
STD::CUT太可怕了,它是未定义的行为(而不是C++异常)我知道这本书很糟糕,但这很荒谬。这对这本书没有多少信心。Windows异常和C++异常是非常不同的动物。我建议烧那本书。不要扔掉它。别人可能会捡起它。<代码>尝试< /C> >和<代码> catch <代码>只针对C++异常而不是CPU例外。NS是两个正交概念,尽管名称相似,但完全不同。应该有一本书叫做“21年自学C++”。。如果我错了,请纠正我,但我相信MSVC的\uuu try
和\uu catch
也会得到这些。@chris IIRC它是\uu,除了
。当然不是。它只是编译器开关的一个替代。woops,表明如果我甚至记不起正确的标识符,我就不会使用它们。顺便说一句,从C中,我发现异常错误处理模型是v非常有效。尤其是要使用它,你必须捕获所有你能捕获的东西。看起来是这样的:假设你有一个类与网络一起工作,更高的一个类与网络、串行等接口一起工作。这些类不关心错误,所有的处理都做得更高。这里可能有很多例外ons:你想手工写这些吗?最后,这些结果会显示一条错误消息并关闭程序。但是,那些不是你可以单独写的。@Hi Angel:一个“不可能的状态”是程序员认为程序永远无法达到的任何状态,因此您有理由放弃进一步考虑。这些状态通常发生在逻辑推理中的致命缺陷、偶尔的判断失误、子模块违反合同、底层平台崩溃和来自上层的恶意干扰。正确处理的信号都不是这些。而且,它们都不以任何方式限制为本机代码,它们也可以发生在“安全”托管代码中。您确定不应从中派生吗?
int* p = 0;
try {
int result = *p / 0;
std::cout << result << std::endl;
}
catch (...) {
std::cout << "Division by zero" << std::endl;
}
#include <exception>
#include <eh.h>
#include <iostream>
class divisionbyzero_exception : public std::runtime_error {
public:
divisionbyzero_exception() : std::runtime_error("Division by zero") {}
};
void translate_seh_exception(unsigned int exceptioncode, struct _EXCEPTION_POINTERS* pExp) {
if (exceptioncode == 0xc0000094) throw divisionbyzero_exception();
}
int main(int argc, char* argv[])
{
_set_se_translator(translate_seh_exception);
try {
int result = argc / 0;
std::cout << result << std::endl;
}
catch (divisionbyzero_exception& ex) {
std::cout << ex.what() << std::endl;
}
return 0;
}