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

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

我知道处理这两种捕获的不同之处,但是椭圆需要什么才能捕获 std::exception 捕获无法捕获的东西?

例如:

try
{
    throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
    std::cout << "Exception: " << e;
}
catch(...)
{
    std::cout << "How did I get here?";
    throw;
}

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

虽然这样做绝对是个好主意,但您 没有 std::exception 派生自定义异常。 C++ 允许您抛出几乎任何对象类型。

因此,例如,throw 1; 将不会由您的第一个处理程序处理。也不会...

class MyCustomException { // Doesn't derive
 ///
};

...如果它被抛出。

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

catch(const std::exception& e)

只会捕获标准异常。

catch(...)

之后会在那里捕获所有内容。

您可以处理整数和其他类型(http://www.cplusplus.com/doc/tutorial/exceptions/)

例如:

catch(int e)

你的意思可能是:

throw std::runtime_error("runtime error!"); // not std::runtime

std::runtime_error is derived from the std::exception 所以你的第一个 catch 块被触发,因为它捕获类型 std::exception 的异常。你的意思可能是:

std::cout << "Exception: " << e.what(); // not e

如果您抛出了 std::run_timestd::exception 及其派生词以外的任何其他内容,则会触发第二个 catch 块。 C++ FAQ 的有用阅读: What should I throw?