Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 整数除零异常为';抓不到_Visual C++_Exception Handling_Seh - Fatal编程技术网

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