A: catch(...)
B: catch(std::exception& e)
问题是A能够捕获什么,而B不能。
为什么在C ++中没有引入可以捕获任何异常的通用根异常?
--- 添加 对不起,我应该说我了解在C ++中您可以抛出任何类型,但除此之外还可以抛出什么?
我的问题是,我正在尝试查找从代码中抛出的异常,可以由A捕获但由B无法捕获。 这个异常肯定不是像“int”这样的类型。它必须是系统异常或内存违规之类的事情。 我只是想知道那可能是什么。
catch (...)
是所谓的“万能捕获块”,它会捕获任何 C++ 异常。
catch(std::exception& e)
仅会捕获从 std::exception
派生的异常。
这是一个将被万能捕获块捕获,但不会被第二个版本捕获的异常示例:
throw 42;
这可能对您来说有些奇怪,事实也确实如此。重要的是要意识到,任何东西都可以作为C++异常抛出——不仅限于exception
或从exception
派生的内容。正如@bames53在评论中提到的那样,没有像其他一些语言中那样所有异常都派生自一个根异常类型。throw
异常。这个全局处理程序可以启动某种故障记录,例如通过记录错误本身或生成外部程序来在失败的程序外部进行记录。通过重新抛出异常,您给代理一个处理可处理的异常的机会,同时允许无法处理的异常终止程序。throw
即可:catch (...)
{
// some magic
throw;
}
另一个需要记住的事情是,当你捕获异常时,通常最好捕获const
引用,而不仅仅是引用。需要注意的另一点是,在使用try-catch语句时,对于可能抛出异常的代码块应该尽量简短,以免降低程序性能。
如果您的代码中有多处可能抛出异常的地方,可以考虑将这些代码块分解成较小的函数,这样可以提高代码的可读性和可维护性。
在处理异常时,要根据具体情况选择使用何种处理方式,比如可以直接处理异常,也可以将异常抛给调用者处理。
catch(...)
也会捕获SEH异常,这绝不是个好主意(你可能会忽略一个访问冲突或用于扩展堆栈的页保护异常)。 - Matteo Italiastd::exception
的内容:#include <exception>
#include <iostream>
int main()
{
try
{
throw false;
}
catch(std::exception& e)
{
std::cout << "Caught std::exception" << std::endl;
}
catch(...)
{
std::cout << "Caught something else" << std::endl;
}
return 0;
}
输出:
捕获到其他异常
try {
throw 123;
} catch (std::exception &e) {
// this won't catch
} catch (...) {
// this will catch
}
int
。C++之所以可以抛出任何东西,是因为他们认为没有理由让异常变得不够通用。这与C++模板类似;C++模板不依赖于继承,因此比如Java或C#的泛型更加通用,而后者则依赖于继承。 - bames53