2012-07-19 237 views
3

我正在使用Spring ROO。 在我的web應用程序中,我可以創建許多用戶並保存。 我也可以更新現有的用戶。java - 異常未被捕獲

對於更新場景,我們使用merge()方法更新現有數據。在數據庫中,「用戶名」列是唯一的。以下是該場景。

  1. 用戶創建了一個用戶名「肖恩」與手機號碼「6039274849」

  2. 用戶創建一個名爲「帕克」與手機號碼「8094563454」

  3. 用戶試圖當另一個用戶用'Sean'更新第二個用戶'Parker',我得到了例外。

在堆棧跟蹤,我可以看到下面的例外是原因

  1. 造成ConstraintviolationException
  2. 造成的SQLException
  3. 造成TransactionSystemException
  4. 造成的PersistenceException
  5. 引起TransactionRollbackException

我嘗試做以下

public String merge() 
    { 
    try{ 
      //code to merge 
     } 
    catch(????? e){ 
     throw e; 
    } 
    } 

我嘗試添加在上述5個例外「????」 。但我不能趕上。

任何人都可以請告訴我需要在'????'中添加哪個異常從上面的列表中發現異常?

P.S:我正在使用Spring ROO。所以我正在更改.aj文件中的代碼。請不要將此問題作爲重複關閉。在結束這個問題之前,我期待任何人回答我的問題。

+0

我試着添加'Exception'來代替'????'它運行良好。但我不想使用'Exception e'。我想知道具體的例外情況。 – user1514499 2012-07-19 02:33:55

+0

然後在你的catch塊中找出'System.out.printn(e)'來找出哪個特定的異常被拋出,它應該是這樣的:'java.lang.NullPointerException' – John 2012-07-19 02:49:07

+0

是否有任何理由爲什麼你不能做一個嘗試和多個catch語句? – 2012-07-19 06:32:38

回答

1

嗯,難道你不是在重新拋出異常嗎?它應該是跟蹤中的「最近期」異常,所以ConstraintValidationException

請注意,通常在Spring/Hibernate應用程序中,冒出您代碼的異常是導致事務回滾的原因。如果你發現異常,你可能會阻止,這可能會導致數據不一致。

+0

我只是想重新拋出,因爲我想向用戶顯示錯誤頁面(帶有相關的錯誤信息)。 – user1514499 2012-07-19 02:42:45

+0

那麼爲什麼趕上它呢? – hvgotcodes 2012-07-19 02:44:21

2

作爲最後的手段,你可以趕上多用途exception

public String merge() 
{ 
    try{ 
      //code to merge 
     } 
    catch(Exception e){ 
     //handle e here. 
    } 
} 
+0

在Spring-Roo中,拋出所有異常並將其轉發到在web-mvc-config.xml和web.xml中配置的錯誤頁面。所以我必須拋出異常。 – user1514499 2012-07-19 02:41:11

+0

好的,消除了那一點。 – SomeKittens 2012-07-19 02:43:12

1

疑問時我嘗試捕捉可拋出,要麼添加斷點或登錄出來,看看它到底是什麼。然後更改代碼accrodingly。

1

最近我有同樣的probelem。它似乎在它自己的異常類中包裝異常。
我解決了這個問題:

try { 
    ... 
} 
catch(Exception e){ 
    System.out.println(e.getClass().getName()); 
} 

與你會發現什麼異常被拋出真的;