3

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

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

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

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

4

1 回答 1

4

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

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

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

 

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

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

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

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

于 2013-06-06T03:16:46.407 回答