我已经搜索了这两种处理程序之间的差异,但是每个人都说这catch(...)是一个捕获所有东西的通用处理程序.
我找不到其中一个可以处理而另一个不能处理的任何异常.即使除以零,也会创建一个它们都无法处理的异常(浮点异常).
谁能给我一个样本并清楚地解释他们的区别?我应该使用哪一个?
有什么例外
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(...).如果您的代码需要单独处理异常,那么您应该为每个预期的异常设置一个处理程序.
当然,任何没有std::exception作为其基类的类型的异常都不会被捕获catch(std::exception& ex).
例如,
struct foo {};
throw foo();
将被捕获catch (...),而不是被捕获std::exception.
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |