C ++ catch(std :: exception& e)与catch(...)

时间:2018-04-17 12:19:17

标签: c++ exception exception-handling

我知道处理这两个捕获的区别,但是椭圆需要捕获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;
}

我已经看过将两者结合使用的代码示例,但我没有看到您同时使用这两种代码的原因。

4 个答案:

答案 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_timestd::exception及其衍生物以外的任何其他内容,则会触发第二个catch块。有用的C ++ FAQ阅读: What should I throw?

答案 3 :(得分:0)

如上所述,throw语句抛出一个类型派生自std::exception的对象,因此它被第一个catch子句捕获。如果将throw更改为throw 3;,则异常将被第二个catch子句捕获,而不是第一个。