我嘗試過幾種不同的捕捉方式。我有一些「清理」代碼,只有在拋出異常時才應該運行。我可以爲每個異常添加相同的代碼,但這會成爲維護噩夢。基本上,我想要像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