2013-01-11 170 views
2

我正在寫一個使用Spring 3框架的web應用程序。考慮一下我擁有N個控制器的情況。每個控制器將請求委託給公開的服務並獲得響應並返回給用戶。捕獲意外異常是否是一種好的做法?

我想知道是否有更好的方法來捕獲意外的運行時異常拋出控制器代碼。我不想爲每個控制器方法編寫如下所示的內容。或者它是唯一的方法?

try { 
    //call the service 
} catch(ServiceException serviceEx) { 
    //do process for know exception 
} catch(Exception ex) { 
    //return generic error message. 
} 

我知道我們可以使用Spring Exception resolver。但是當意外錯誤發生時,我不想顯示不同的錯誤頁面。我想在UI上顯示一些通用的錯誤消息,作爲我的小部件的一部分?

編輯:

我也不想我的用戶看到異常堆棧跟蹤試圖執行某些操作時。

孫大信

+0

是否有預期的異常? –

+0

@阿米爾:一個「預期」的例外是你特別捕捉的例外。你期待它,這就是爲什麼你寫了一個'catch'子句。意想不到的是你不會捕獲的,這可能會以堆棧跟蹤的形式出現在UI中。 – Gabe

回答

1

您可以捕捉使用此方法運行時意外的異常。

try { 
    ... 
    } catch (Exception e) { 
    throw new RuntimeException("msg",e); 
    } 
3

我想趕上RuntimeException s是不好的做法。原本爲RuntimeException s,認爲是編程錯誤的人員(例如NullPointerException,表示缺少null檢查)。而檢查的異常意味着指出程序可以從中恢復的錯誤(例如FileNotFoundException)。

今天的問題是,許多框架使用RuntimeException s應該使用檢查的異常。因此很難區分程序可以處理異常的情況和遇到編程錯誤(bug)的情況。

這是我個人對企業發展這個東西的看法。我知道大多數人要求放棄檢查的異常,並將所有事情都作爲未經檢查的異常處理(如Scala)。

2

在我看來,你應該只在你的代碼中捕捉異常,你可以從中恢復。所有其他異常(選中或未選中)都應該被一個異常處理程序捕獲,該異常處理程序將記錄異常並向用戶顯示一些通用錯誤頁面(可能帶有可用於查找異常的id)。

例如,在Struts2你會說這像這樣:

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="unrecoverableException"/> 
</global-exception-mappings> 

我從來沒有使用Spring MVC的,但這篇文章似乎給您一個尤伯杯的ExceptionHandler的選項:

http://doanduyhai.wordpress.com/2012/05/06/spring-mvc-part-v-exception-handling/

0

我認爲RuntimeException是爲違反合同或某些不可恢復的錯誤而設計的。大多數情況下,您應該讓容器或一些外部基礎架構爲您處理。或者你必須編寫大量冗餘代碼來處理它們,這與Spring的設計哲學有點相沖突。

就你而言,可能是你可以利用一些過濾器或攔截器來捕獲那些意外的RuntimeException,如果你真的需要將它們轉移到一些其他通用消息。

相關問題