抛出非异常对象

MBZ*_*MBZ 8 c++ exception

C++允许throw任何类型的对象.从exceptions到string甚至int.但我从未见过任何throwexceptions 之外的任何现实世界的应用.

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

Joh*_*ing 9

从实用性的角度来看,有将近1扔没有应用stringS,intS,或其他任何未衍生std::exception.

这不是因为没有迹象表明这样做,而是因为有禁忌症表明你不应该这样做.

有两个主要原因导致您不想抛出任何非衍生的东西std::exception:

  1. 例外安全.例如,如果你抛出一个std::string并且它的构造或副本string引发了另一个异常,那么terminate它将被调用,你的过程将不再存在.你永远不会有机会catchstd::string.
  2. 可用性. 投掷衍生物std::exception使得catch (const std::exception&)以通用方式成为可能.如果你扔别的东西,你需要一个catch针对那种情况.

可以在此处找到关于异常的良好讨论.


1几乎没有申请[...]: 每条规则都有例外情况,但即使承认这一点,我也从未见过合法排除投票的衍生物std::exception.


Nik*_*iou 5

更多的是一种黑客而不是语言功能,您可以抛出一个对象,然后捕获它以强制函数“返回”与其正常返回类型不同的东西。

int aFunc()
{
    throw foo(); // if you catch that foo, you 've imitated returning foo
    return 0; // ok just an int
}
Run Code Online (Sandbox Code Playgroud)

这当然是一个糟糕的设计选择,并且违反了 C++ 提供的类型安全,但是假设您有一个在巨大的代码库中大量使用的函数,并且您想要尝试一些更改(其中涉及更改返回类型),那么这将是肮脏的在实际实施更改之前进行尝试的方法(并 grep 整个代码库以进行更改)

编辑:

您应该更仔细地阅读该帖子。我说过“一个糟糕的设计选择”和“违反了 C++ 提供的类型安全”和“在实际实施更改之前”。如果这还不够警告的话,我认为这些评论或反对票就不够了。

另一方面,尝试更改在 6e06 行代码库中使用了 666 次的函数的返回类型,在将其上传到版本控制系统并多次破坏开发人员的编译后,会发现这不是您想要的在除您之外的其他平台上工作。

如果有捷径你难道不想知道吗?在实施更改并将其实际发布到代码库之前,您不会使用它吗?

即使这些问题的答案是“否”,我认为这篇文章是关于探索可能性的,仅仅提及一个本身并不是“邪恶”的。我个人是从 Bjarne 的演讲中听到这个的:http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style,后来他也说了同样的话,关于不使用这些东西。

  • -1。非常糟糕的建议。例外是针对特殊情况,而不是一般的流量控制。 (3认同)
  • @CaptainObvlious 实际上这个建议非常好。他明确表示不应该这样做。为什么要否决某人指出技术上可能的用途并明确指出这是一个坏主意?至少,如果发布者在野外遇到这种虐待行为,它至少让他有机会认识到这种虐待行为。我实际上见过使用这种黑客的生产代码。有关更完整的示例,请参阅 http://www.drdobbs.com/cpp/twisting-the-rtti-system-for-safe-dynami/229401004。 (3认同)