2010-12-09 24 views
1

如果發生任何錯誤,我需要觸發一些代碼。基本上我需要一個finally塊,只有在發生異常情況下才會執行。我會實現它是這樣的:如何在Java中使用`finally`實現錯誤case

HttpURLConnection post(URL url, byte[] body) throws IOException { 
    HttpURLConnection connection = url.openConnection(); 
    try { 
     OutputStream out = connection.getOutputStream(); 
     try { 
      out.write(body); 
     } finally { 
      out.close(); 
     } 
     return connection; 
    } catch (Throwable t) { 
     connection.disconnect(); 
     throw t; 
    } 
} 

看起來不錯,但它不會編譯:我的功能不能扔Throwable

我可以重新寫:

} catch (RuntimeException e) { 
     connection.disconnect(); 
     throw e; 
    } catch (IOException e) { 
     connection.disconnect(); 
     throw e; 
    } 

但即使如此,我是一個)丟失了所有的錯誤和b)必須隨時更改我的實現拋出不同類型的異常修復這處代碼。

這是一般可以處理這種情況嗎?

+4

沒有檢查異常只是非常棒* – cdhowie 2010-12-09 22:57:51

+0

@cdhowie:我也不喜歡檢查異常,但這是一個錯誤和Throwable被檢查但未檢查的情況;運行時沒有任何內容聲明「拋出XxxError」,但是如果你試圖(重新)拋出XxxError,它會被檢查 - HUH?那是怎麼回事? Checked異常應該使用由編譯器檢查的Throwable的CheckedException抽象子類來完成,而不是當前的「魔術」 - 當然這使我能夠將Throwable重新引發一個檢查的異常,但我不確定這是否是這樣壞事。 – 2010-12-10 01:55:51

+0

@軟件猴子:實際上`錯誤`沒有被檢查 - 我只是檢查了。 :)你可以肯定地捕獲並重新拋出`Error`,而不必在`throws`子句中提及它。它會爲我的解決方案增加另一個案例,使其更不易維護。現實情況是,Java代替`CheckedException`,並且有兩個未經檢查的樹,`RuntimeException`和`Error`,其他所有內容都被檢查。 – SnakE 2010-12-10 03:55:38

回答

11

您可以使用finally塊,並添加一個標誌來指示成功。

bool success = false; 
try { 
    //your code 
    success = true; 
    return retVal; 
} finally { 
    if (!success) { 
     //clean up 
    } 
} 
3

Throwable有兩個子類,ErrorException。對於Error的Javadoc說:

一個錯誤是Throwable的 一個子類,指示的嚴重問題 合理應用程序不應該試圖 趕上。大多數此類錯誤是 異常情況。 ThreadDeath 錯誤雖然是一個「正常」的條件,但也是 也是Error的一個子類,因爲大多數 應用程序不應該試圖去捕捉 它。

所以,除非這是一個真正不同尋常的situtation,你可以只專注於Exception

catch (IOException e) { 
    connection.disconnect(); 
    throw e; 
} 
catch (RuntimeException e) { 
    connection.disconnect(); 
    throw e; 
} 
catch (Exception e) { 
    connection.disconnect(); 
    throw new IOException(e); 
} 
-1

除非是我弄錯了一個異常就不需要一個finally塊停止執行,做你需要的東西,像清理或錯誤緩解。

try { 
    // Do some work! 
    // Fail 
} catch (IOException e) { 
    // Clean up, alert user, expected error 
} catch (Exception e) { 
    // Not so much expected, but lets try to handle this 
} 

錯誤應該來自您實施的類和方法,這些方法基本上是您的想法。考慮執行流程和錯誤傳播。如果上面的方法沒有捕獲到特定的異常,那麼無論調用它什麼都會看到異常。

Throwable只是具有子類的頂級類。一般來說,例外情況就是一切。並且記住你也可以實現你自己的例外來處理任務。

相關問題