我目前有一些我想重构的代码。大量异常具有一些针对所有异常的公共代码以及需要针对每种特定异常类型单独处理的一些特定代码。我试图弄清楚如何摆脱每个catch
块中的公共部分。一个想法就是这样做:
try {
/* Stuff that may fail */
} catch( const std::exception & ) {
/* do common part here */
try { throw; }
catch( const exception1 & ) {
/* do stuff for exception1 here */
}
catch( const exception2 & ) {
/* do stuff for exception2 here */
}
}
然而,这让我觉得有些难看。
有没有更好的方法来分解这个共同的逻辑,或者实际上是否有理由完全避免这种尝试?
答案 0 :(得分:3)
一大堆例外有一些共同的代码
将公共代码移动到函数或方法中。从每个catch
调用方法。就像消除任何其他重复一样;存在try
.. catch
没有任何区别。
<强>被修改强>
但如果你真的关注“一大堆异常”,真正的问题可能是你有一大堆例外。为什么不同的例外需要不同的处理?异常是否仅用于特殊事件?
答案 1 :(得分:3)
通常,try
/ catch
应该只在代码中显得稀疏。问题是,例如,在早期返回的情况下,很多时候在catch
子句中完成的操作也应该完成。
Idiomatic C ++广泛使用RAII来避免需要在catch
子句中进行清理的情况,这通常会删除大部分工作。
现在,你的模式本身并不是很糟糕本身,它确实考虑了常见的东西。但这种常见的东西也许可以自动处理。
在我偶然发现的所有代码库中,我只看到了几次真正使用catch
子句,不要将它用作离合器。
答案 2 :(得分:0)
我真的只是将公共代码移动到一个函数。
这是另一个想法:
try {
/* Stuff that may fail */
} catch( const std::exception & e) {
/* do common part here */
if (const exception1 * e1 = dynamic_cast<const exception1*>(&e) {
/* do stuff for exception1 here */
} else if (const exception2 * e2 = dynamic_cast<const exception2*>(&e) {
/* do stuff for exception2 here */
} else
throw;
}