Java 如何使代码仅在引发异常时运行?
之后我尝试了几次不同的捕捉。我有一些“清理”代码,只有在抛出异常时才应该运行这些代码。我可以为每个异常添加相同的代码,但这会成为维护的噩梦。基本上,我希望类似于finally语句的内容,但它只在抛出异常时运行Java 如何使代码仅在引发异常时运行?,java,exception,Java,Exception,之后我尝试了几次不同的捕捉。我有一些“清理”代码,只有在抛出异常时才应该运行这些代码。我可以为每个异常添加相同的代码,但这会成为维护的噩梦。基本上,我希望类似于finally语句的内容,但它只在抛出异常时运行 这可能吗?不幸的是,没有直接的支持。像这样的怎么样 boolean successful = false; try { // do stuff successful = true; } catch (...) { ... } finally { if (!s
这可能吗?不幸的是,没有直接的支持。像这样的怎么样
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&catch呢
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
}
我可以为每个异常添加相同的代码,但这会成为维护的噩梦
或者如果你抹去了“例外”:
我可以向每个[位置]添加相同的代码,但这会成为维护的噩梦
这就是制作方法的目的
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
}
但我不确定我是否真的喜欢这个解决方案。。。感觉有点像黑客。我可能更愿意看到在每个实例中显式处理异常,即使这意味着重复调用某种共享清理函数。这正是任何主体都不应该做的。ifstreet上的噩梦。这些是您正在捕获的运行时错误还是您自己的业务错误。IOException、ClientProtocolException、UnsupportedEncodingException等现在您无法访问调用方内部的内容。如果那是你需要清理的地方,你就用水管冲洗。如果你把那些乱七八糟的东西传进来,那么你就是在硬编码要修复的东西的列表——如果这个列表以后改变了,你就必须改变每个使用它的地方。而且你会错过一个。哦,如果你坚持要使用这个
清理
函数,那么它肯定应该是私有的
。@cHao虽然是真的,但最后一个肯定更好,如果你错过了一个地方,代码就无法编译,所以这就不那么糟糕了