【发布时间】:2011-12-05 09:05:07
【问题描述】:
虽然我同意捕获... 而不重新抛出确实是错误的,但我相信使用这样的结构:
try
{
// Stuff
}
catch (...)
{
// Some cleanup
throw;
}
在RAII 不适用的情况下可接受。 (请不要问...不是我公司的每个人都喜欢面向对象编程,RAII 经常被视为“无用的学校东西”...)
我的同事说,您应该始终知道要抛出哪些异常,并且您始终可以使用以下构造:
try
{
// Stuff
}
catch (exception_type1&)
{
// Some cleanup
throw;
}
catch (exception_type2&)
{
// Some cleanup
throw;
}
catch (exception_type3&)
{
// Some cleanup
throw;
}
对于这些情况,是否有公认的良好做法?
【问题讨论】:
-
@Pubby:不确定这是不是完全相同的问题。链接的问题更多关于“我应该抓住
...”,而我的问题集中在“我应该在重新抛出之前更好地抓住...或<specific exception>” -
很抱歉,没有 RAII 的 C++ 不是 C++。
-
因此,您的奶牛工人摒弃了为解决某个问题而发明的技术,然后争论应该使用哪种劣质替代方案?很抱歉,但这似乎愚蠢,无论我怎么看。
-
“捕捉......而不重新抛出确实是错误的” - 你错了。在
main中,catch(...) { return EXIT_FAILURE; }很可能在不在调试器下运行的代码中是正确的。如果你没有抓住,那么堆栈可能不会被展开。只有当您的调试器检测到您希望它们离开main的未捕获异常时。 -
... 所以即使是“编程错误”,也不一定意味着您不想知道它。无论如何,你的同事都不是优秀的软件专业人士,所以正如 sbi 所说,很难谈论如何最好地处理一开始就长期虚弱的情况。
标签: c++