catch(...)可以处理catch(exception和ex)不能处理的异常吗?

JGC*_*JGC 7 c++ c++11

我已经搜索了这两种处理程序之间的差异,但是每个人都说这catch(...)是一个捕获所有东西的通用处理程序.

我找不到其中一个可以处理而另一个不能处理的任何异常.即使除以零,也会创建一个它们都无法处理的异常(浮点异常).

谁能给我一个样本并清楚地解释他们的区别?我应该使用哪一个?

Nia*_*all 7

有什么例外catch(...)可以处理而catch(exception& ex)不能吗?

是的,任何不是或不来自的例外std::exception都不会被捕获catch(exception&).例如; throw 42;会被抓住catch(...),但不会catch(exception&).

A throw exception();可以被捕获; 选择第一个处理程序.本catch(...)应该是最后的处理程序.

即使除以零,也会创建一个它们都无法处理的异常(浮点异常)......

Visual Studio有两种异常处理模式; synchronous(/EHsc)和asynchronous(/EHa).对于同步处理,都catch(...)catch(exception&)只赶上C++异常; 即那些被抛出的人throw xyz;.对于异步处理,可以捕获访问冲突等catch(...).

VS还提供了一个_set_se_translator()可用于"翻译"或处理Win32异常的函数.通常,该函数用于将Win32异常转换为exception可由a处理的C++异常(派生自)catch(exception&).

翻译可能看起来像的样本(为简洁起见省略了一些细节);

struct seh_exception : std::runtime_error {
    //...
};

struct access_violation : seh_exception {
    //...   
};

struct unspecified_seh_exception : seh_exception {
    //...
};

void translation_function(unsigned int code, ::EXCEPTION_POINTERS* info)
{
    switch (code) {
    case EXCEPTION_ACCESS_VIOLATION:
        throw access_violation();
        break;
    // more cases for other exception codes
    };

    throw unspecified_seh_exception();
}
Run Code Online (Sandbox Code Playgroud)

我应该使用哪一个?

你应该使用你可以做的事情.如果所有异常导致代码处理相同,则使用catch(...).如果您的代码需要单独处理异常,那么您应该为每个预期的异常设置一个处理程序.


Bat*_*eba 5

当然,任何没有std::exception作为其基类的类型的异常都不会被捕获catch(std::exception& ex).

例如,

struct foo {};

throw foo();

将被捕获catch (...),而不是被捕获std::exception.


jua*_*nza 5

你被允许投掷任何东西(例如一个int),并catch(...)会抓住任何东西.catch(exception&)只会捕获exception或派生类型.