我尝试过几种不同的捕捉方式。我有一些“清理”代码,只有在抛出异常时才应该运行。我可以为每个异常添加相同的代码,但这会成为维护噩梦。基本上,我想要像finally语句那样的东西,但它只能在抛出异常时才运行。如何仅在抛出异常时才使代码运行?
这可能吗?
我尝试过几种不同的捕捉方式。我有一些“清理”代码,只有在抛出异常时才应该运行。我可以为每个异常添加相同的代码,但这会成为维护噩梦。基本上,我想要像finally语句那样的东西,但它只能在抛出异常时才运行。如何仅在抛出异常时才使代码运行?
这可能吗?
不幸的是没有直接的支持。这样的事情如何
boolean successful = false;
try {
// do stuff
successful = true;
} catch (...) {
...
} finally {
if (!successful) {
// cleanup
}
}
我能想到的唯一的事情是在每个捕获设置一个变量,然后在最后检查该变量。
伪代码:
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
}
}
你为什么不只是用简单的尝试&收获?
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
}
正是没有人应该做的事情。 “如果”街道上的噩梦。 – Shahzeb
我可以在相同的代码添加到每个异常,但成为一个维护的噩梦。
或者,如果你遮住了“例外”:
我可以在相同的代码添加到每个[地方],而是成为一个维护的噩梦。
这就是方法的提出。
private void cleanup() { /* clean up */ }
...
try {
// oh noes
} catch (MyException me) {
cleanup();
} catch (AnotherException ae) {
cleanup();
}
维护麻烦了!
你可以尝试包装异常处理程序的两层,并重新抛出异常你已经完成了共同处理后:
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
}
不知道我很喜欢这种解决方案虽然...感觉像一个有点黑客攻击。我可能宁愿看到在每个实例中明确处理的异常,即使这意味着重复调用某种共享清理函数。
是您遇到的这些运行时错误还是您自己的业务错误。 – Shahzeb
IOException,ClientProtocolException,UnsupportedEncodingException等 – Bromide