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