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

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

本文关键字:catch vs C++ exception std      更新时间:2023-10-16

我知道这两个捕获的处理差异,但是椭圆需要什么才能捕获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;
}

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

catch(const std::exception& e)

将仅捕获 std 异常。

catch(...)

之后会抓住那里的一切。

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

例如:

catch(int e)

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

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

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

。如果它被扔了。

你可能的意思是:

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

std::runtime_error 派生自 std::exception,因此您的第一个 catch 块在捕获类型 std::exception 的异常时被触发。你可能的意思是:

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

如果您抛出除std::run_timestd::exception及其衍生物以外的任何其他内容,则会触发第二个catch块。从C++常见问题解答中阅读有用的内容:我应该扔什么?

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