如果我不在try块中使用throw关键字,可以抛出异常吗?

时间:2016-02-26 12:53:47

标签: c++ exception-handling

请考虑以下代码段:

try
{
    //Code without a single throw keyword
}
catch(...)
{
    cout<<"Exception thrown";
}

编辑:try块内调用的函数在任何地方都不包含throw个关键字。

catch块是否可以执行?

5 个答案:

答案 0 :(得分:5)

肯定是的。在C ++中,如果new无法分配内存,则默认情况下会抛出std::badalloc异常。由于许多C ++代码调用new,因此抛出异常总是可能的。

答案 1 :(得分:4)

你倒退了。您应该考虑每个 C ++代码片段,以便它可以抛出异常,直到证明不是这样。在现代C ++中,“另外证明”在这里转换为noexcept

答案 2 :(得分:3)

标准C ++为您提供了很少的抛出异常的方法。最重要的是throw关键字。还有exception_ptr::rethrow_exception。还有一些其他标准功能,例如在空指针上失败operator new,失败dynamic_casttypeid,指定在发生故障时抛出,但是有效地是语言运行时的一部分,这意味着它们不会直接构成throw,即使实际实现可能在内部使用throw

但是,并非所有与您交互的代码都必须是标准C ++。很长一段时间,Microsoft编译器支持catch(...)可以捕获系统错误(如访问冲突)的功能。在GCC下,一个不同语言的例外(例如用GCJ编译的代码中的Java异常)也可能被捕获。

当然,throw本身是由编译器以某种方式实现的,而低级代码可以在不实际使用throw的情况下模拟它,可能通过调用语言运行库的特殊函数或通过使用asm块。

答案 3 :(得分:2)

这取决于。您在try块中执行的操作之一可能会在失败时抛出自己的异常。

有些东西上没有throw关键字,但它们仍然可以抛出。默认情况下,new会导致失败,因此如果您的任何代码使用new,您仍可能会引发异常。这实际上取决于您使用的代码。

答案 4 :(得分:1)

try可能包含对某些函数,运算符,带有错误强制转换的写操作,错误数学,资源错误等的调用,这些操作可能会导致未被捕获throwrethrow。在这种情况下,可能会执行这样的catch块。