2012-09-09 37 views
6

我不確定如何管理GUI中的異常;我的目標是讓用戶知道是否出現錯誤並顯示可理解的消息。在Swing GUI中處理異常

我在考慮做這樣的事情:

// I'm inside an actionPerformed() method 
try { 
    // do whatever I have to do here 
} catch (KnownBusinessException1 e) { 
    // inform the user and do something; 
    // most times simply inform the user that it wasn't possible to complete the 
    // operation and remain in the same window instead of moving forward. 
} catch (KnownBusinessException2 e) { 
    // just as above 
} catch (KnownDataAccessException1 e) { 
    // just as above 
} catch (KnownDataAccessException2 e) { 
    // just as above 
} catch (RuntimeException e) { // I want to catch any other unexpected exception, 
// maybe NPE or unchecked IllegalArgumentExceptions and so on 
    // something went wrong, I don't know where nor how but I will surely inform the user 
} 

現在:如果try塊有檢查的異常趕上,那會是更好的嵌套的try/catch或捕獲這些檢查捕獲RuntimeException之後的異常? (它可能取決於,我甚至不知道這是否會發生btw)

另一件事:Error是什麼?如果我是一個用戶,我不希望遇到意外的關機,我寧願讓應用告訴我有什麼地方出現了令人難以置信的錯誤,並且沒有人能對此做任何事情,「世界的盡頭即將到來,所以我將立即退出「。至少我會知道那不是我的錯。

順便說一句不知道這是否是一個很好的做法,以發現錯誤...:\

有一種更好的方式在Swing應用程序做到這一點?

+0

看看本作的錯誤http://stackoverflow.com/questions/352780/when-to-catch-java-lang-error –

+0

[我怎樣捕獲事件調度線程(EDT)異常?](http://stackoverflow.com/questions/4448523/how-can -i-catch-event-dispatch-thread-edt-exceptions) – trashgod

+0

@BheshGurung我已經讀過它了。那麼,如果沒有問題,我想我會在RuntimeException catch塊之後添加另一個catch塊,以便捕獲錯誤並在退出之前嘗試通知用戶。 @ trashgod:對我來說這似乎不是重複:) – tmh

回答

0

如果在try塊中檢查了要捕獲的異常,在捕獲RuntimeException之後嵌套try/catch還是捕獲這些檢查的異常會更好嗎? (它可能取決於,我甚至不知道這是怎麼回事BTW發生)

就像你說這取決於它是否有意義try塊來執行,其餘的代碼異常有後被抓住了。如果沒有,那麼嵌套try/catch塊沒有意義。

0

一個很好的方式來展現用戶出了問題是使用JOptionPane秒。添加到圖標的好用法(信息/錯誤),你很好去。下面是供你參考一些示例代碼:

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

你可以,如果你想:)

至於以同樣的方式處理多個異常過度JOptionPane考慮一些定製/抽象類,如果消息在所有3 KnownBusinessException s和KnownDataAccessException s中都是一樣的,那麼你可以確保兩個類都具有相同的親子關係並且捕獲一個類。如果KnownBusinessException s需要同樣的處理,而不是KnownDataAccessException s,請將所有KnownBusinessException與同一個父母以及所有KnownDataAccessException與同一個父母同時處理。希望您能夠通過此操作獲得我要去的地方。

+0

這裏沒有新東西,我知道如何使用JOptionPane,如果我想以同樣的方式處理多個異常,我肯定不會複製/粘貼。 – tmh

+1

對不起,我誤解了你的問題。 @Ibalazscs'涉及'UncaughtExceptionHandler'的答案可以滿足你的要求。在應用程序級別,您可以處理任何未捕獲的內容。假設你希望在屏幕級別執行此操作(如果您希望發生運行時異常,則應該爲這些異常添加捕獲。希望這有助於:) – javatarz

10

我認爲最好的是明確地捕獲所有檢查的異常,併爲其餘的安裝一個未捕獲的異常處理程序。看到這一點:How can I detect when an Exception's been thrown globally in Java?

這是我如何使用Thread.setDefaultUncaughtExceptionHandler:

public static void setupGlobalExceptionHandling() { 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      handleException(e); 
     } 
    }); 
} 

注意「sun.awt.exception.handler」招爲EDT線程,在多那麼帖子中提到,是不是必要且不能在Java 7中運行。對於Java 7,只需使用標準的Thread.setDefaultUncaughtExceptionHandler,如上所述。當然,如果您使用這兩種機制來註冊異常處理程序,代碼將在所有版本中運行。

順便說一句,如果未捕獲的異常被拋出EDT線程將自動重新啓動(但你的應用程序可能會處於不一致的狀態),看到這一點:EDT and runtime exception

+1

提及'UncaughtExceptionHandler'。在您的代碼中確實是一件好事:) – javatarz

+0

@lbalazscs:謝謝,但我不明白handleException(e)應該做什麼。這是處理運行時異常(例如日誌記錄)的常用方法嗎?如果我想針對RuntimeException的不同子類採取不同的操作,具體取決於拋出了哪個異常以及導致該異常的用戶的操作? – tmh

+0

我的視圖中的運行時異常不是由用戶操作引起的,而是由程序員錯誤引起的:)在GUI中,我將顯示異常消息,可能帶有堆棧跟蹤,我會要求用戶使用此信息聯繫開發人員。 SwingX中的JXErrorPane類執行此操作。但是你可以做任何你想做的事情,包括檢查異常的確切類別。 – lbalazscs