2009-06-24 44 views
1

在JBoss 4.2.2(在JDK5上),我注意到了這種行爲。有沒有配置或其他方式來防止它?Jboss 4.2吞噬了堆棧跟蹤EJB異常的原因,怎麼可以防止呢?

如果我有這樣的代碼:

try { 
    doSomething(); 
} catch (Exception e) { 
    throw new EJBException(e); 
} 

產生的堆棧跟蹤(捕獲和記錄時)將是:

EJBException .... 
    at(..... 
    at(..... 

caused by: NullPointerException 

沒有爲NullPointerException異常沒有堆棧跟蹤。有沒有一種方法可以防止堆棧跟蹤的吞嚥並實際上將完整的堆棧跟蹤作爲引發的一部分?

+0

你使用任何類型的日誌庫,像log4j的呢? – Gandalf 2009-06-24 21:55:22

+0

是的,並且該代碼至少應該是日誌記錄,但是我有一堆代碼,如果有一個設置來獲取堆棧跟蹤,這將有助於確保至少不會吞下問題。 – Yishai 2009-06-24 22:10:41

回答

3

這是一個實施決定,他們沒有將原因設置爲ejbException的原因。您可以通過getCausedByException()方法訪問它。 你有一個JIRA [1]關於這個(看看這個,因爲有一個痛苦的解決方法),你可以看看JBoss AS實現[2]。

[1]:https://jira.jboss.org/jira/browse/EJBTHREE-337

[2]:http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/trunk/jboss-j2ee/src/main/javax/ejb/EJBException.java?revision=39121&view=markup&sortby=rev&pathrev=39121

0

可能是EJBException不可鏈接。

我不知道你的例子是否代表你的真實代碼,但我會問你爲什麼要捕獲一個異常,把它包裝成一個EJBException並重新拋出它?這樣做不會增加任何有意義的新信息。你的catch塊甚至不會記錄最初的異常。所以 - 爲什麼抓住所有?爲什麼不直接在方法簽名中聲明異常並讓客戶處理呢?我能想到的唯一的好理由是EJBException不是一個檢查的異常,所以你可以免除客戶端的責任。但即使這樣也很危險。我想你會想確保這個異常不會跨越層邊界傳播。用戶界面看到一個原始的,未捕獲的異常會有什麼好處?

+0

如果拋出檢查異常,事務不會回滾。 EJBException在其構造函數中接受異常,儘管它可能會使用自己的遺留鏈接代碼而不是JDK1.4中引入的代碼,否則會破壞堆棧跟蹤,儘管我期望它成爲容器的一部分。我同意這裏的異常處理是不好的,但是我有很多遺留的代碼,所以我試圖至少打撈出好的堆棧跟蹤。 – Yishai 2009-06-24 22:09:23