删除过度热心的try..catch块的破坏性最小的方法是什么?

时间:2013-07-12 16:34:24

标签: c# refactoring

我继承的代码库充满了error-hiding anti-pattern

public void foo() {
  try {
    //Entire body of method, sometimes only 5 lines but often 500+
  } catch (Exception e) {
    Logger.LogToFile(e.msg); 
  }
}

此模式的实例数量为数百个。

我的方法是完全删除try..catch块,因为我们已经在顶层有一个异常处理程序。 这是不受欢迎的,因为我觉得我正在改变行为。 (更多例外会冒泡)。

理想情况下,我会查看10-500行的100个实例中的每一个,并找出可能抛出的异常。然后我只会用更严格的块来压缩这些例外:

public void foo() {
  //...
  try {
    // ~1-5 lines
  } catch (ArgumentInvalidException e) {
    Logger.LogToFile(e.ToString()); 
    //TODO handle
  }
  //...
  try {
    // ~1-5 lines
  } catch (UnitConversionException e) {
    Logger.LogToFile(e.ToString()); 
    //TODO handle
  }
  //...
}

这是一项令人生畏的努力。

有人能想出一个聪明的方法来解决这个问题吗?

相关 - Removing excessive try-catch blocks

1 个答案:

答案 0 :(得分:1)

在这种情况下,可能“提取方法”http://refactoring.com/catalog/extractMethod.html会有所帮助。 当我编写代码时,我尝试区分错误和异常。通常情况下,错误!=异常。例外情况过于昂贵,只有在特殊情况下才会发生。

我会解释:

try
{
    int.Parse("..")
}
catch()
{
    // parsing Exception
}

VS

if(int.TryParse("..", out value)
{
    // parsing Error
}