2012-03-07 53 views
4

我想知道如果我想要捕捉一個錯誤,我總是必須使用try-catch-error塊來混亂代碼。對於異常,總是嘗試抓住最後?中央錯誤管理?

或者我可以以某種方式定義一個全局錯誤捕獲器? 特別是關於Java EE Webapps。

對於每個未處理的前端,我想登錄到特定文件,並向用戶顯示一般錯誤頁面。

我想我可能會在某些方面做到這一點。但對於@AfterThrowing的方面,我也必須引入try-catch塊。由於沒有中央班級的後門面,所以我不得不圍繞每個後備方法與trycatches。 然後,這方面將採取他們,但我需要的東西趕上沒有明確的拋出異常。

我怎麼能這樣呢?

回答

3

您在尋找declare soft的結構。這會將給定的異常包裝在SoftException(AspectJ特定的RuntimeException)中,以便它不需要明確處理。然後,您可以通過一些AfterThrowing建議來處理所有這些例外情況。

declare soft只存在於代碼樣式AspectJ中(即沒有註釋)。所以,你需要使用AspectJ編譯器編譯你的代碼,但是如果你願意的話,你仍然可以使用加載時編織。

在這裏看到: http://www.eclipse.org/aspectj/doc/released/progguide/quick-other.html

在這裏: http://www.eclipse.org/aspectj/doc/released/adk15notebook/declare-soft.html


編輯

這裏有一個代碼片段展示瞭如何可以做到:

aspect ErrorHandler { 
    declare soft : Exception : within(*); 
    after() throwing(Exception e) : handler(e) { 

    // do something... 
    } 
} 

這無線將通過您的自定義錯誤處理程序在您的系統中路由全部異常。而且你不需要明確地捕捉或扔掉它們。

它簡單而強大。雖然也許太強大了。我建議提煉並更精確地確定哪些例外應該被緩解,哪些應該被告知,但這是基本的想法。

0

對異常情況的更好的控制,調試/提供有意義的消息就越容易。

到什麼程度?我會將其與您的應用程序的複雜性/預期壽命相關聯。這些越大,越精細,應該是你的處理。

我看到兩個主要技術途徑:

  • 用戶的方法:你得到至少一個異常處理的每個UI動作(這樣你就可以說:「不要再次按下該按鈕」)。調試器方法:每種方法都有其控制。

請記住,大多數處理可能只是記錄重新拋出的異常。

更重要的是,您的Java EE框架很可能在其配置文件(其中許多可與java.util.loggin或log4j一起使用)中具有日誌選項。你可以調整它;當然,發送到每個日誌類別的內容將取決於框架實現(所以可能不是所有的ERROR消息都是異常)。

1

您不必在每種方法中都這樣做。

您不應該捕捉到您無法「處理」的異常。處理意味着不僅僅是重新拋出或記錄或打印堆棧跟蹤。我認爲處理意味着實施有意義的恢復策略。

這可能意味着「降壓停在這裏」:你是Gandalf在層邊界的橋樑上,並且不會有異常通過。您不希望用戶看到令人討厭的消息,因此您可以將它們發送給朋友,輕鬆理解頁面,告訴他們下一步該做什麼。

最後並不總是必要的,但它非常適合清理文件句柄和數據庫遊標等資源。

如果您無法處理異常,那麼向方法簽名添加throws子句並讓調用者找出他們想要執行的操作並不丟臉。

1

在一般情況下,沒有機制來做到這一點 - Java沒有你要找的東西。

但是,根據您的情況,這可能是可能的。

web.xml異常處理

web.xml文件允許您定義的URL將被用來處理特定類型的異常。 (例如,參見http://wiki.metawerx.net/wiki/Web.xml.ExceptionType)。
由於你正在編寫一個web應用程序,你可能只能讓異常拋出一切,然後以這種方式處理它們。

自定義攔截

你提到你有後備門面。根據它們的構建方式,您可能會在其前面放置一個通用代理來捕捉和處理您感興趣的異常。您已用spring標記了您的問題,您可能需要查看Spring AOP代理。

可能有其他的方式來獲得你想要的,但它將取決於你的應用程序的體系結構的具體情況。

+0

這個問題不是關於Java,而是關於AspectJ。 – 2012-03-08 19:02:52

+0

@ArewrewEisenberg - 這是關於JEE的webapps,它的標籤爲'java','spring'和'aspectj'。沒有理由不提供純Java的解決方案。 – Tim 2012-03-09 01:29:23

+0

夠正確。我被你的第一行拋棄了,「沒有任何機制可以做到這一點」。在純JEE中,沒有,但AspectJ中的解決方案是微不足道的。 – 2012-03-09 04:22:43