2010-10-12 18 views
7

Zajmuję się programowaniem wahadłowym i jestem trochę zdezorientowany, jak mogę obsługiwać wyjątki na przykład ostatnio część mojego kodu zmienić nazwy plików, więc kiedy testowałem to przyszedłem z "nie masz uprawnień do zmiany nazwy pliku", ponieważ otrzymałem go z komunikatu o wyjątku drukowania. Więc w jaki sposób mogę przekazać tę wiadomość użytkownikowi? i czy powinienem użyć komunikatu JOptionPane lub po prostu pokazać go na pasku stanu?Jak obsługiwać wyjątek java w przyjazny dla użytkownika sposób

Dzięki

Odpowiedz

8

Z twojego pytania wynika, że ​​już wiesz, jak sobie z tym poradzić w sensie java. Jednak gdy już je złapiesz, szukasz porady, jak reagować na wyjątki.

W konkretnym przykładzie, który podałeś w pytaniu I (jako użytkownik), chciałbym, aby błąd został przedstawiony w jasny sposób, więc JOptionPane może być twoim najlepszym wyborem. Nie zaktualizowałbym paska stanu, ponieważ jest on bardzo bliski cichej awarii, a użytkownik będzie po prostu pozostawiony w konflikcie.

Osobista zasada polega na tym, że jeśli użytkownik prawdopodobnie czeka na kod, aby ukończyć przed wykonaniem zadania, musi zostać poinformowany o awarii silnie, tj. Okienka modalnego. Jeśli awaria jest w zadaniu tła, które użytkownik może wykonać bez dbania o to, lub kod może odzyskać od niego, lub kod będzie próbował ponownie, wtedy podążę z bardziej subtelnym podejściem do paska stanu lub zmiany ikony w zależności od interfejsu użytkownika.

+0

Dzięki, ale innym problemem jest to, jak wydrukować określoną wiadomość dla użytkownika, która najlepiej opisuje wyjątek. Czy mogę wydrukować komunikat wyjątku? –

+1

Myślę, że to powinno zależeć od wyjątku. Jeśli masz pewność, że jest to problem z uprawnieniami, poinformuj o tym użytkownika. Jeśli jednak jest to wyjątek, którego się nie spodziewałeś (na przykład przepełnienie stosu), może być wskazane wyświetlenie wyjątku. – kskjon

+1

Może to zależeć od tego, kto jest użytkownikiem, czy są to technicy czy nie? Zależy to również od błędu, w tym konkretnym przypadku błąd jest dość jasny, więc prawdopodobnie mógłbyś po prostu wydrukować tekst błędu, w innych przypadkach ... powiedzieć NullPointerException ... te nic nie znaczą dla użytkownika i jako taki powinieneś udziel im bardziej prostego wyjaśnień z instrukcją sprawdzania dzienników lub porozmawiania z działem pomocy technicznej firmy. –

-1

obsługi Zastosowanie try-catch ...

http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

Podczas połowu wyjątek można robić, co chcesz z nim. Wyświetlić go użytkownikowi, zrobić coś innego w kodzie, wyświetlić inną wiadomość do użytkownika na podstawie wyjątku, itp.

+0

Pytanie nie było ale "jak wyświetlić wyjątki dla użytkownika w moim GUI?". –

+0

, ale o to właśnie OP mówi! –

+0

@Jason S - Spójrz na tytuł. "w przyjazny dla użytkownika sposób" oznacza, że ​​OP już wie, jak je złapać. – Ishtar

0

Jeśli złapiesz wyrażenie (zawarte w bloku z hasłem próbnym), otrzymasz powiadomienie, gdy wyjątek występuje. Następnie musisz zdecydować: czy istnieje sposób na sprawienie, aby wszystko znów działało? Czy mógłbyś, na przykład, poprosić użytkownika o inną nazwę pliku? Więc zrób to! Ale jeśli nie ma rozsądnego sposobu na obejście błędu, po prostu przerywaj program.

+0

Nie odpowiada to na pytanie "jak powiadomić o wyjątku użytkownika". –

1

Nie bardzo rozumiem pierwszą część twojego pytania, ale próbuję odpowiedzieć na drugą. Ogólnie, sposób wyświetlania błędu użytkownikowi zależy od oprogramowania i błędu. W większości przypadków odpowiednia jest wersja JOptionPane lub podobna. Jednak w niektórych przypadkach dialog modalny może być zbyt nachalny, a pasek stanu może być lepszym rozwiązaniem. Ale znowu to zależy od rodzaju oprogramowania, które piszesz.

1

Jeśli przewiduje się, że wyjątek może wystąpić w wyniku działania użytkownika, należy jawnie go przechwycić w punkcie, który ma sens i zapewnić prawidłowe odzyskiwanie programu.

Na przykład, jeśli użytkownik może zmienić nazwę pliku, można wywołać metodę rename(), która zwraca kod stanu, aby wskazać powodzenie lub kod błędu. Wewnątrz metody jeden z tych kodów może zostać wywołany przez wyjątek, ale kod wywołujący nie ma znaczenia. Po powrocie połączenia kod statusu może zostać użyty do określenia, który komunikat o błędzie ma zostać wyświetlony (jeśli jest).

enum RenameStatus { 
    Success, 
    Failed, 
    SecurityFailed 
    } 

    void doRename(File fromFile, File toFile) { 
    switch (rename(fromFile, toFile)) { 
    case Success: 
     break; 
    case Failed: 
     // todo generic dialog rename operation failed 
     break; 
    case SecurityFailed: 
     // todo security dialog rename operation failed due to permission 
     break; 
    } 
    } 

    RenameStatus rename(File fromFile, File toFile) { 
    try { 
     if (!fromFile.renameTo(toFile)) { 
     return RenameStatus.Failed; 
     } 
     return RenameStatus.Success; 
    } 
    catch (SecurityException e) { 
     // Error - permission error 
     return RenameStatus.SecurityFailed; 
    } 
    catch (Exception e) { 
     return RenameStatus.Failed; 
    } 
    } 
+0

Obawiam się, że to nie odpowiada na pytanie OP. –

2

Aby rozwinąć komentarz Kevina D, zależy to od oczekiwań odbiorców. Jeśli są biegli technicznie, możesz użyć tekstu wyjątku, tak jak jest. Jeśli nie, to na początku komunikatu "Wystąpił błąd, skontaktuj się z personelem pomocy technicznej z następującymi informacjami:" następnie dołącz komunikat o błędzie i najlepiej unikalny identyfikator lokalizacji powiązanego wpisu dziennika ... Często używam znacznik czasu dla tego.

Jeśli naprawdę chcesz mieć ochotę, możesz wysłać e-mail do pracowników pomocy technicznej o wiele więcej szczegółów, takich jak wyjątek i pełny ślad stosu, kopia wpisu do dziennika itp. Zrobiłem to w przeszłości, ale musisz zachować ostrożność ponieważ często występujący błąd szybko zaleje skrzynkę odbiorczą :)

Oczywiście, jeśli błąd może zostać naprawiony przez użytkownika, możesz po prostu powiedzieć (i jak to zrobić) w swojej wiadomości. To jest tak dokładny i fantazyjny, jak można uzyskać ...

+0

Całkowicie się z tobą zgadzam –

0

Pozwolenie na plik jest rodzajem "normalnego" wyjątku, a nie prawdziwie "wyjątkowy" jak "pełny dysk", więc prawdopodobnie po prostu użyj JOptionPane zamiast wysyłać raport o błędach. Biorąc to pod uwagę, niektóre wcześniejsze odpowiedzi są bardzo pouczające i powinny zostać przyjęte w ogólnych przypadkach.

Ponadto moja main() zawsze zaczynają się w ten sposób: „Jak złapać wyjątki”

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() 
{ 
    public void uncaughtException(Thread t, Throwable e) 
    { 
     // do your things: see earlier answers 
    } 
} 
Powiązane problemy