在设计我的第一个“严肃的” C ++库时,我在问自己:
从中衍生出某些例外std::exception
是后代吗?
即使阅读后
我还不确定。因为,除了常见的(但可能不是很好)的做法之外,我将以库用户的身份假设,std::exception
仅当标准库函数在库实现中失败时,库函数才会抛出s,而它对此无能为力。但仍然,在编写应用程序代码时,对我来说非常方便,并且恕我直言,好看的只是抛出一个std::runtime_error
。另外,我的用户还可以依赖定义的最小接口,例如what()
或代码。
例如,我的用户提供了错误的参数,比抛出a更方便std::invalid_argument
吗?因此,与在其他代码中看到的std :: exception的常用用法结合在一起:为什么不走得更远,从您的自定义异常类(例如lib_foo_exception)以及std::exception
。
有什么想法吗?
lib_foo_exception
类从派生时std::exception
,库用户将lib_foo_exception
仅捕获catch ,而仅捕获库文件的库用户std::exception
。所以我也可以问我的库异常根类是否应该继承自std :: exception。
lib_foo_exception
?” 通过继承,std::exception
您可以通过catch(std::exception)
OR来实现catch(lib_foo_exception)
。无需派生于std::exception
,只有当,由catch(lib_foo_exception)
。
catch(...)
。之所以在这里是因为该语言允许您考虑的情况(以及“行为异常”的库),但这不是现代的最佳实践。
std::exception
并不意味着您抛出了std::exception
。此外,std::runtime_error
确实会从继承std::exception
,而what()
方法来自std::exception
,而不是std::runtime_error
。而且,您绝对应该创建自己的异常类,而不是抛出诸如之类的通用异常std::runtime_error
。