关于 C++ 中的异常,我有三个是/否问题:
异常类是否必须从标准库中定义的异常类派生?
如果在函数中抛出异常,例如 ,
f()
但未在此处处理,则异常将传播到调用 的函数f()
。这是真的吗?异常对象可以是用户定义的类型或 C++ 内置的任何类型。这是真的?
(1) 异常类是否必须从标准库中定义的异常类派生?
实际上,任何东西都可以作为异常抛出,包括基本类型(例如int
)或 C 字符串。如果您抛出的异常是类类型的,则只有 15.1/5 C++11 中定义的条件:
当抛出的对象是类对象时,复制/移动构造函数和析构函数应该是可访问的,即使复制/移动操作被省略(12.8)。
(2) 如果在函数中抛出异常,例如 ,
f()
但未在此处处理,则异常会传播到调用 的函数f()
。这是真的吗?
如果它是从try...catch
子句内部抛出的,并且catch
定义了与异常类型(或类层次结构中它的祖先)匹配的语句,则将捕获异常。否则(或者如果从 catch 语句中捕获并重新抛出),它确实会传播到调用函数,并以相同的方式递归处理。
(3) 异常对象可以是用户定义的类型或任何内置于 C++ 中的类型。这是真的?
是的,但上述 (1) 中所述除外;如果是类类型,则必须可访问复制和移动构造函数和析构函数。(它们不必是用户定义的,但它们必须是可访问的,即不是私有的。)