请考虑以下代码段:
try
{
//Code without a single throw keyword
}
catch(...)
{
cout<<"Exception thrown";
}
编辑:try
块内调用的函数在任何地方都不包含throw
个关键字。
catch块是否可以执行?
答案 0 :(得分:5)
肯定是的。在C ++中,如果new
无法分配内存,则默认情况下会抛出std::badalloc
异常。由于许多C ++代码调用new
,因此抛出异常总是可能的。
答案 1 :(得分:4)
你倒退了。您应该考虑每个 C ++代码片段,以便它可以抛出异常,直到证明不是这样。在现代C ++中,“另外证明”在这里转换为noexcept
。
答案 2 :(得分:3)
标准C ++为您提供了很少的抛出异常的方法。最重要的是throw
关键字。还有exception_ptr::rethrow_exception
。还有一些其他标准功能,例如在空指针上失败operator new
,失败dynamic_cast
和typeid
,指定在发生故障时抛出,但是有效地是语言运行时的一部分,这意味着它们不会直接构成throw
,即使实际实现可能在内部使用throw
。
但是,并非所有与您交互的代码都必须是标准C ++。很长一段时间,Microsoft编译器支持catch(...)
可以捕获系统错误(如访问冲突)的功能。在GCC下,一个不同语言的例外(例如用GCJ编译的代码中的Java异常)也可能被捕获。
当然,throw
本身是由编译器以某种方式实现的,而低级代码可以在不实际使用throw
的情况下模拟它,可能通过调用语言运行库的特殊函数或通过使用asm
块。
答案 3 :(得分:2)
这取决于。您在try块中执行的操作之一可能会在失败时抛出自己的异常。
有些东西上没有throw关键字,但它们仍然可以抛出。默认情况下,new
会导致失败,因此如果您的任何代码使用new
,您仍可能会引发异常。这实际上取决于您使用的代码。
答案 4 :(得分:1)
try
可能包含对某些函数,运算符,带有错误强制转换的写操作,错误数学,资源错误等的调用,这些操作可能会导致未被捕获throw
或rethrow。在这种情况下,可能会执行这样的catch块。