2015-01-20 27 views
7

例如,類型爲:java.net.BindException的異常可以引發「地址已在使用中」(試圖綁定另一個程序使用的端口)或「權限被拒絕」(您不有根權限來打開這個端口號)。我不擁有拋出BindException的類。區分同類型的異常

那麼,區分這些「不同」異常與相同類型的最佳做法是什麼?

我這樣做,但我不知道是否是最佳的做法:

try { 
    //...some scary stuffs here 
} 
catch (BindException e){ 
      if (e.getMessage().contentEquals("Permission denied")){ 
       System.out.println("ERROR**You must be ROOT to bind that port address TCP:"+defaultPort); 
      } 
      else if (e.getMessage().contentEquals("Address already in use")){ 
       System.out.println("ERROR**Port TCP:"+defaultPort+" already in use by onother application"); 
      } 
      e.printStackTrace(); 
     } 
+1

如果你在代碼的多個部分都這樣做,那麼我建議你把它拿出來放在它自己的類中,就像一個實用程序類。 – ultrajohn 2015-01-20 18:47:48

+0

此外,我會做的是爲每種BindException生成一個子類。 – ultrajohn 2015-01-20 18:49:23

+0

否;這只是例如在這裏;但tnx協作。 – 2015-01-20 19:00:32

回答

5

那要看情況。如果這是你自己或訪問代碼和的BindException是不恰當的,那麼你應該創建自己的異常:

public class PermissionDeniedException 

你甚至可以這樣做:

public class PermissionDeniedBindException extends BindException 

但是,如果這是不是你類,那麼你使用的庫不希望你區分BindException,並且期望你在接收異常時以某種通用的方式行事(即只是繼續或總是嘗試)或者這是SDK中的問題。如果後者是這種情況,並且這個項目是開源的,我會建議創建一個請求。

否則,第三個選項當然要按照你所做的來完成......但我不會推薦它,因爲它非常脆弱,只需修改消息就可以改變。

+1

此外,一些異常與空消息引發,所以假設否則是危險的。 e.getMessage()!= null && e.getMessage()會使用null檢查和startsWith()更安全更靈活:e.getMessage()。contentEquals(「Permission denied」 .startsWith(「Permission denied」)' – gknicker 2015-01-20 18:51:06

+0

我不擁有拋出這些異常的類。該類是java.net.ServerSocket。我認爲在你的答案中提到的第三個選項聽起來不錯......如果庫java.net不改變任何東西,當然。 – 2015-01-20 18:57:03

+1

除非你想修改java.net API,否則我認爲你別無選擇,只能繼續你正在做的事情。你可以用這個方法做的最好的事情就是把所有的東西都放在你的代碼庫中,以使事物組織和一致。 – ultrajohn 2015-01-20 19:06:34

相關問題