从实用性的角度来看,有将近1扔没有应用string
S,int
S,或其他任何未衍生std::exception
.
这不是因为没有迹象表明这样做,而是因为有禁忌症表明你不应该这样做.
有两个主要原因导致您不想抛出任何非衍生的东西std::exception
:
std::string
并且它的构造或副本string
引发了另一个异常,那么terminate
它将被调用,你的过程将不再存在.你永远不会有机会catch
说std::string
. std::exception
使得catch (const std::exception&)
以通用方式成为可能.如果你扔别的东西,你需要一个catch
针对那种情况.可以在此处找到关于异常的良好讨论.
1几乎没有申请[...]: 每条规则都有例外情况,但即使承认这一点,我也从未见过合法排除投票的衍生物std::exception
.
更多的是一种黑客而不是语言功能,您可以抛出一个对象,然后捕获它以强制函数“返回”与其正常返回类型不同的东西。
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,后来他也说了同样的话,关于不使用这些东西。