是否有catch(...)可以处理而catch(异常和ex)不能处理的异常?

时间:2016-07-12 07:11:06

标签: c++ c++11

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

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

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

4 个答案:

答案 0 :(得分:7)

  

catch(...)无法处理catch(exception& ex)可以处理的任何异常吗?

是的,std::exception不会捕获任何未从catch(exception&)派生的异常。例如; throw 42;会抓住catch(...),但catch(exception&)会抓住throw exception();

任何一个都可以抓住catch(...);选择第一个处理程序。 /EHsc应该是最后一个处理程序。

  

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

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

VS还提供了一个功能_set_se_translator(),可用于"翻译"或处理Win32异常。通常,该函数用于将Win32异常转换为可由catch(exception&)处理的C ++异常(派生自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(); } )。

翻译的样子(为简洁起见省略了一些细节);

catch(...)
  

我应该使用哪一个?

你应该使用你可以做的事情。如果所有异常导致代码处理相同,则使用var Controls1 = new ControlViewModel[] { }; // array with length 0 。如果您的代码需要单独处理异常,那么您应该为每个预期的异常设置一个处理程序。

答案 1 :(得分:5)

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

例如,

struct foo {};

throw foo();

将由catch (...)捕获,而不是由std::exception抓住。

答案 2 :(得分:5)

你可以扔几乎任何东西(例如int),而catch(...)会抓住任何东西。 catch(exception&)只会捕获exception或派生类型。

答案 3 :(得分:3)

catch(...){}正在捕捉所有异常。 catch(std::exception& ex){}正在捕获std::exception作为基类的所有异常。

http://en.cppreference.com/w/cpp/language/try_catch