C ++中异常的规则和语法

时间:2013-06-06 03:05:41

标签: c++ exception

我对C ++中的异常有三个是/否问题:

  1. 是否必须从标准库中定义的异常类派生异常类?

  2. 如果在函数中抛出异常,例如f(),但未在那里处理,则异常将传播到调用f()的函数。这是真的吗?

  3. 异常对象可以是用户定义的类型,也可以是内置于C ++中的任何类型。这是真的吗?

1 个答案:

答案 0 :(得分:4)

  

(1)是否必须从标准库中定义的异常类派生异常类?

实际上任何东西都可以作为例外抛出,包括基本类型(例如int)或C字符串。如果抛出的异常是class-type,则只有15.1 / 5 C ++ 11中定义的条件:

  

当抛出的对象是类对象时,即使复制/移动操作被省略,也应该可以访问复制/移动构造函数和析构函数(12.8)。

  

(2)如果在函数中抛出异常,例如f(),但未在那里处理,则异常将传播到调用f()的函数。这是真的吗?

如果从try...catch子句中抛出它,并且定义的catch语句与异常类型(或类层次结构中的祖先)匹配,则会捕获异常。否则(或者如果从catch语句中捕获并重新抛出),它将确实传播到调用函数,并以递归方式以相同的方式处理。

  

(3)异常对象可以是用户定义的类型,也可以是内置于C ++中的任何类型。这是真的吗?

是的,除非上述(1)所述;如果是类类型,则必须可以访问复制和移动构造函数和析构函数。 (它们不必是用户定义的,但它们必须是可访问的,即不是私有的。)