Java 如何使代码仅在引发异常时运行?

Java 如何使代码仅在引发异常时运行?,java,exception,Java,Exception,之后我尝试了几次不同的捕捉。我有一些“清理”代码,只有在抛出异常时才应该运行这些代码。我可以为每个异常添加相同的代码,但这会成为维护的噩梦。基本上,我希望类似于finally语句的内容,但它只在抛出异常时运行 这可能吗?不幸的是,没有直接的支持。像这样的怎么样 boolean successful = false; try { // do stuff successful = true; } catch (...) { ... } finally { if (!s

之后我尝试了几次不同的捕捉。我有一些“清理”代码,只有在抛出异常时才应该运行这些代码。我可以为每个异常添加相同的代码,但这会成为维护的噩梦。基本上,我希望类似于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&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虽然是真的,但最后一个肯定更好,如果你错过了一个地方,代码就无法编译,所以这就不那么糟糕了