5

我目前有一些我正在尝试重构的代码。一大组异常有一些用于所有异常的通用代码以及一些需要针对每种特定异常类型单独处理的特定代码。我试图弄清楚如何摆脱每个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 */
  }
}

然而,这让我觉得有些难看。

有没有更好的方法来分解这种常见的逻辑,或者实际上有理由完全避免这种尝试?

4

3 回答 3

3

一大堆异常有一些共同的代码

将公共代码移动到函数或方法中。从 each 调用方法catch。就像消除任何其他重复一样;try..的存在catch没有区别。

但如果你真的关心“一大组异常”,那么真正的问题可能是你有一大组异常。为什么不同的异常需要不同的处理?异常真的只用于异常事件吗?

于 2012-04-13T12:04:04.193 回答
3

通常,try/catch应该只在代码中稀疏出现。问题是很多时候在一个catch子句中完成的动作也应该在提前返回的情况下完成,例如。

惯用 C++ 广泛使用 RAII 来避免需要在catch子句中进行清理的情况,这通常会删除大部分工作。

现在,您的模式本身并没有那么糟糕,它确实考虑了常见的东西。但是这种常见的东西也许可以自动处理。

在我偶然发现的所有代码库中,我只有几次看到真正使用的catch子句,不要将其用作离合器。

于 2012-04-13T12:15:22.347 回答
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;
}
于 2012-04-13T12:14:59.027 回答