2011-09-27 94 views
9

我尝试过几种不同的捕捉方式。我有一些“清理”代码,只有在抛出异常时才应该运行。我可以为每个异常添加相同的代码,但这会成为维护噩梦。基本上,我想要像finally语句那样的东西,但它只能在抛出异常时才运行。如何仅在抛出异常时才使代码运行?

这可能吗?

+0

是您遇到的这些运行时错误还是您自己的业务错误。 – Shahzeb

+0

IOException,ClientProtocolException,UnsupportedEncodingException等 – Bromide

回答

18

不幸的是没有直接的支持。这样的事情如何

boolean successful = false; 
try { 
    // do stuff 
    successful = true; 
} catch (...) { 
    ... 
} finally { 
    if (!successful) { 
     // cleanup 
    } 
} 
1

我能想到的唯一的事情是在每个捕获设置一个变量,然后在最后检查该变量。

伪代码:

Boolean caught = false; 

try { 

    //risky code here 

catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
finally { 
    if (caught) { 
     // Do clean up 
    } 

} 
0

你为什么不只是用简单的尝试&收获?

try 
{ 
    foo(); 
} 
catch(Exception1 e1) 
{ 
    dealWithError(1); 
} 
catch(Exception2 e2) 
{ 
    dealWithError(2); 
} 
catch(Exception3 e3) 
{ 
    dealWithError(3); 
} 

... 

private void dealWithError(int i) 
{ 
    if(i == 1) // deal with Exception1 
    else if(i == 2) // deal with Exception2 
    else if(i == 3) // deal with Exception3 
} 
+2

正是没有人应该做的事情。 “如果”街道上的噩梦。 – Shahzeb

1

我可以在相同的代码添加到每个异常,但成为一个维护的噩梦。

或者,如果你遮住了“例外”:

我可以在相同的代码添加到每个[地方],而是成为一个维护的噩梦。

这就是方法的提出。

private void cleanup() { /* clean up */ } 

... 

try { 
    // oh noes 

} catch (MyException me) { 
    cleanup(); 
} catch (AnotherException ae) { 
    cleanup(); 
} 

维护麻烦了!

+2

除现在你无法访问调用者内部的东西。如果这是需要清理的东西,那么你就会被洗净。如果你把这些混乱的东西传递过来,那么你就是在编写需要修复的东西清单 - 如果这个清单后来改变了,你必须改变每一个使用它的地方。你会错过一个。 – cHao

+0

噢,如果你坚持拥有它,这个''清理'函数应该*绝对*是'私人'。 – cHao

+0

@cHao虽然ture和finally是更好的,但是如果你错过了一个地方,代码就不会编译,所以这样还不坏 – Voo

0

你可以尝试包装异常处理程序的两层,并重新抛出异常你已经完成了共同处理后:

try { 
     try { 
      // your code goes here 

     } catch (Throwable t) { 
      // do common exception handling for any exception 
      throw t; 
     }  

    } catch (NullPointerException nx) { 
     // handle NPE 
    } catch (Throwable t) { 
     // handle any other exception 
    } 

不知道我很喜欢这种解决方案虽然...感觉像一个有点黑客攻击。我可能宁愿看到在每个实例中明确处理的异常,即使这意味着重复调用某种共享清理函数。

相关问题