2015-01-20 45 views
7

Na przykład wyjątek typu: java.net.BindException może wyświetlać "Adres już w użyciu" (próbując powiązać port używany przez inny program) lub "Odmowa uprawnień" (nie można mieć uprawnienia root'a do otwarcia tego numeru portu). Nie jestem właścicielem klasy, która zgłasza wyjątek BindException.rozróżnić wyjątki tego samego typu

Co to jest najlepsza praktyka odróżniania tych "różnych" Wyjątków tego samego typu?

Robię to, ale nie wiem, czy to najlepsza praktyka:

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

Jeśli robisz to w wielu częściach kodu, sugeruję, abyś to zrobił i umieścił w swojej klasie, jak klasa narzędziowa. – ultrajohn

+0

Dodatkowo, zrobię podklasę dla każdego rodzaju wyjątku BindException. – ultrajohn

+0

no; jest to tylko na przykład tutaj; ale tnx do współpracy. –

Odpowiedz

5

To zależy. Jeśli jest to kod jesteś właścicielem lub mieć dostęp do i BindException nie jest właściwe, to powinieneś utworzyć własne wyjątki:

public class PermissionDeniedException 

Można nawet zrobić:

public class PermissionDeniedBindException extends BindException 

Jednakże, jeśli to nie jest twoje class, wtedy albo biblioteka, której używasz, nie chce, żebyś rozróżniał między BindException i oczekuje, że zachowasz się w jakiś ogólny sposób podczas otrzymywania wyjątku (tj. po prostu kontynuujesz lub zawsze próbujesz ponownie) LUB to jest problem w SDK. Jeśli jest to późniejsze, a ten projekt jest open source, polecam utworzenie żądania ściągnięcia.

W przeciwnym razie trzecią opcją jest oczywiście wykonanie dokładnie tak, jak robisz ... ale nie polecałbym tego w ogóle, ponieważ jest bardzo delikatny i może się zmienić, modyfikując wiadomość.

+1

Ponadto, niektóre wyjątki są zgłaszane z pustym komunikatem, więc założenie, że jest inaczej, jest niebezpieczne. Zamiast 'e.getMessage(). ContentEquals (" Odmowa uprawnień ")', bezpieczniejsze i bardziej elastyczne jest używanie zerowej kontroli i startsWith() jak: 'e.getMessage()! = Null && e.getMessage() .startsWith ("Odmowa uprawnień") ' – gknicker

+0

Nie jestem właścicielem klasy, która rzuca wyjątek. Ta klasa to java.net.ServerSocket. Myślę, że trzecia opcja wspomniana w twojej odpowiedzi brzmi dobrze ... jeśli biblioteka java.net nic nie zmieni, oczywiście. –

+1

Chyba że chcesz zmodyfikować interfejs API java.net, myślę, że nie masz wyboru, ale kontynuujesz to, co robisz. Najlepsze, co możesz zrobić, to umieścić wszystko na swoim miejscu w bazie kodu, aby wszystko było uporządkowane i spójne. – ultrajohn

Powiązane problemy