我知道处理这两个捕获的区别,但是椭圆需要捕获std :: exception catch不能捕获的东西吗?
例如:
try
{
throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
std::cout << "Exception: " << e;
}
catch(...)
{
std::cout << "How did I get here?";
throw;
}
我已经看过将两者结合使用的代码示例,但我没有看到您同时使用这两种代码的原因。
答案 0 :(得分:2)
尽管这样做绝对是个好主意,但您 无法从PATH
派生自定义例外。 C ++允许你几乎抛出任何对象类型。
因此,std::exception
将不会由您的第一个处理程序处理。也不会......
throw 1;
......如果它被扔了。
答案 1 :(得分:2)
catch(const std::exception& e)
仅捕获std例外。
catch(...)
之后会抓住那里的一切。
您可以处理整数和其他类型(http://www.cplusplus.com/doc/tutorial/exceptions/)
例如:
catch(int e)
答案 2 :(得分:2)
你可能意味着:
throw std::runtime_error("runtime error!"); // not std::runtime
std::runtime_error派生自std::exception,因此您捕获类型std::exception
的异常时会触发第一个catch块。你可能意味着:
std::cout << "Exception: " << e.what(); // not e
如果您丢弃了std::run_time
或std::exception
及其衍生物以外的任何其他内容,则会触发第二个catch
块。有用的C ++ FAQ阅读:
What should I throw?
答案 3 :(得分:0)
如上所述,throw
语句抛出一个类型派生自std::exception
的对象,因此它被第一个catch
子句捕获。如果将throw更改为throw 3;
,则异常将被第二个catch
子句捕获,而不是第一个。