2011-02-24 63 views
3

我必須下載一些URL,並且在操作過程中可能會發生一些異常,例如java.net.NoRouteToHostException。我認爲這是一個臨時的錯誤例外,因爲如果您在一段時間後重試它,下載可以成功。
所以,我想捕捉所有與臨時錯誤有關的例外情況,並且我已經開始使用這些例外情況:java.net.NoRouteToHostExceptionjava.net.SocketException
您能否列出其他例外情況?捕獲臨時網絡錯誤導致的異常

+1

java.net.SocketException是java.net.NoRouteToHostException的父親,因此您可能只捕獲父級。 SocketException的其他childs是BindException,ConnectException和PortUnreachableException。也許這只是在你的情況下只捕獲SocketException ... – reef 2011-02-24 15:40:41

+0

添加我的評論作爲答案 – reef 2011-02-24 15:47:01

回答

4

java.net.SocketExceptionjava.net.NoRouteToHostException的母公司,所以你可能只捕獲父母。 SocketException的其他孩子是BindException,ConnectExceptionPortUnreachableException。也許可以只捕獲SocketException在你的情況下...

0

由於@reef已經說過java.net.NoRouteToHostException exntends java.net.SocketException,所以如果你捕獲java.net.SocketException就足夠了。但java.net.SocketException擴展IOException,我認爲這是你應該捕捉的。所有的IO問題都應該拋出這個異常。

0

HttpRetryException是另一個。也許在java.net中沒有擴展SocketException的所有東西?

一個快速(非常髒)的方式可能是

try { 
.... 
} catch(Exception e) { 
    if(e.getClass().getPackage().getName().equalsIgnoreCase("java.net")) { 
     retry(); 
    } 
} 
+1

但是,你可能不想把'java.net.MalformedURLException'視爲臨時網絡錯誤。 – satur9nine 2016-04-28 00:06:18

1

一種模式有時它是有用用於暫時性錯誤的重試的操作處理是定義一個錯誤回調接口和實現一些類它;當發生錯誤時,讓回調對象知道,並讓它決定是否拋出異常或應該重試該操作。由於現有的通信類不遵循這種模式,因此可能需要捕捉它們的例外情況並將其轉化爲回調。

請注意,與正常的異常處理相比,此方法可以更輕鬆地處理許多錯誤處理場景。除此之外,它可以很容易地設置可以嘗試多少次重試,可能需要多長時間等的策略,並且還提供了一種在接收到類似「取消」請求時跳過未來重試的方法。

相關問題