c++ - 抛出非异常对象

标签 c++ exception

C++ 允许throw任何类型的对象。从 exceptionstring 甚至 int。 但是除了exception之外,我从未见过任何throwing 的真实世界应用。

我的问题是,throwexception对象的应用是什么?

最佳答案

从实用性的角度来看,几乎1 没有用于抛出stringint 或其他任何东西的应用程序t 派生自 std::exception

这并不是因为没有迹象表明这样做,而是因为有一些禁忌症表明您不应该这样做。

您不想抛出任何不是从 std::exception 派生的东西的主要原因有两个:

  1. 异常安全。例如,如果您抛出一个 std::string 并且该 string 的构造或拷贝会引发另一个异常, terminate 将被调用,您的进程将不复存在。您将永远没有机会捕获 std::string
  2. 可用性。 抛出 std::exception 的衍生物使得以通用方式catch (const std::exception&) 成为可能。如果您抛出其他东西,您将需要一个 catch 来应对这种情况。

可以找到关于异常的很好的讨论 here .


1 几乎没有应用 [...]: 每条规则都有异常(exception),但即使承认这一点,我也从未见过合法 排除抛出 std::exception 的衍生物。

关于c++ - 抛出非异常对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559355/

相关文章:

python - 在 Python 中跟踪一个被忽略的异常?

python - 带有预抛出钩子(Hook)的自定义异常?

c++ - 相同的 AVX2 程序在 gcc 和 msvc 中产生不同的结果

c++ - 多个翻译单元中的内联函数

c++ - 汽车出了什么问题?

c++ - libcurl4-openssl-dev :armhf cannot be installed when libcurl4-openssl-dev is already installed

java - 使用 do while 循环时出现 NoSuchElementException

c++ - 跨平台方式获取可用字体列表?

c# - Web API 2 中的 ExceptionFilter 与 ExceptionLogger 与 ExceptionHandler

java - JTA事务意外回滚,嵌套异常为javax.transaction.RollbackException