我已经搜索了这两种处理程序之间的差异,但是每个人都说catch(...)
是一个捕获所有内容的通用处理程序。
我找不到其中一个可以处理而另一个不能处理的异常。即使除以零,也会创建一个它们都无法处理的异常(浮点异常)。
有人能给我一个样本并清楚解释他们的区别吗?我应该使用哪一个?
答案 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
作为基类的所有异常。