2010-08-19 108 views
24

我最近遇到了一个由程序员编写的代码,他在catch中有一个try catch语句!异常处理try catch catch catch

请原谅我不能粘贴实际的代码,但他的所作所为是类似的东西这个

try 
{ 
//ABC Operation 
} 
catch (ArgumentException ae) 
{ 
    try 
    { 
     //XYZ Operation 
    } 
    catch (IndexOutOfRangeException ioe) 
    { 
     //Something 
    } 
} 

我个人觉得这是我所见过的最穷的代码之一! 在1到10的范围内......你觉得我应该多快,并给他一个我的想法? 还是我过度反应?

编辑: 他实际上在做什么是在捕捉,他正在执行一些其他操作,可以/应该在初次尝试失败时完成。我的问题是有一个干净的代码和可维护性。将第一个catch的异常委托给不同的函数或调用函数是可以的,但是添加更多的代码可能会或可能不会将异常抛入第一个catch,这是我感觉不好的。我尽量避免多个堆叠的“if-loop”语句,我发现这同样很糟糕。

  • IvarD
+8

这是很常见的,所以没有看到代码实际上做了什么 - 这没有什么本质上的错误。 – nos 2010-08-19 21:05:09

+5

我宁愿问他他试图达到什么目的。 – 2010-08-19 21:12:46

回答

107

为什么那么糟糕?这是没有什么不同概念比:

void TrySomething() { 
    try { 


    } catch (ArgumentException) { 
     HandleTrySomethingFailure(); 
    } 
} 

void HandleTrySomethingFailure() { 
    try { 

    } catch (IndexOutOfRangeException) { 

    } 
} 

你去那边之前,给他一块你的大脑(试顶叶,这是特别反感),正是你要对他说?你怎么回答这个谚语“为什么?”

更具讽刺意味的是,当抖动嵌入此代码时,它看起来与您的示例完全相同。

-Oisin

+16

我完全同意。如果你觉得他的代码有问题,并且愿意与他对话,那么你最好有一个很好的替代方案来呈现。 – ChrisNel52 2010-08-19 21:07:07

11

不知道的代码做的事情很难说。但它不是不寻常的要做到这一点。

例如如果您在处理异常时必须清理资源,那么该清除代码本身可能会引发异常。

17

这里有一个案例:

try{ 
    //Dangerous Operation 
} catch (AnyException ae) { 
    try { 
     //Do rollback which can fail 
    } catch (RollbackFailedException rfe) { 
     //Log that 
    } 
} finally { 
    try { 
     //close connection but it may fail too 
    } catch (IOException ioe) { 
     //Log that 
    } 
} 

这是关于同样的事情@ x0n说。尝试关闭资源时或在尝试解决由另一个异常引起的情况时,您可能需要处理异常。