很多時候我們會用到自定義異常來表示特定的錯誤情況,自定義異常比較簡單,只要分清是運行時異常還是非運行時異常即可,運行時異常不需要捕獲,繼承自RuntimeException,是由容器自己拋出,例如空指針異常。
非運行時異常繼承自Exception,在拋出後需要捕獲,例如文件未找到異常。
此處我們用的是非運行時異常,首先定義一個異常LoginException:
- /**
- * 類描述:登錄相關異常
- *
- * @author ming.li <a href="http://www.linuxidc.com">www.linuxidc.com</a>
- * @time 2011-4-27 下午01:08:11
- */
- public class LoginException extends Exception {
-
- /** 版本號 */
- private static final long serialVersionUID = 5843727837651089745L;
- /** 錯誤碼 */
- private String messageKey;
- /** 參數 */
- private Object[] params;
-
- /**
- * 默認構造函數
- */
- public LoginException() {
- super();
- }
-
- /**
- * 登錄相關異常,頁面直接顯示錯誤信息<br/>
- *
- * @param messageKey
- * 錯誤碼
- * @param params
- * 參數
- */
- public LoginException(String messageKey, Object... params) {
- this.messageKey = messageKey;
- this.params = params;
- }
-
- /**
- * @return the messageKey
- */
- public String getMessageKey() {
- return messageKey;
- }
-
- /**
- * @return the params
- */
- public Object[] getParams() {
- return params;
- }
-
- }
這是個登錄異常,用來表示登錄情況下發生的各種錯誤。這個異常只有基本內容,可以根據你的情況自行添加。
在發生登錄錯誤時調用代碼:
- public String login() throws LoginException {
- throw new LoginException("9999");// 用戶名或密碼錯誤
- }
其中的9999是錯誤碼,這個可以自己定義,用來在國際化時顯示不同信息。
此時拋出了一個登錄異常的信息,我們就需要在跳轉是捕獲並顯示在頁面中。
首先在struts的action配置中捕獲此異常:
- <package name="login-default" namespace="/" extends="struts-default">
-
- <!-- 登錄 -->
- <action name="login" class="loginAction" method="login">
- <exception-mapping result="login" exception="com.xxx.exception.LoginException"/>
- <result name="success">index.jsp</result>
- <result name="login">login.jsp</result>
- </action>
- </package>
此時我們可以看到,當拋出LoginException時struts會捕獲並跳轉到login這個result上,進而跳轉到login.jsp。
在login.jsp中我們就需要去顯示異常信息:
- <%@taglib prefix="s" uri="/struts-tags"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
- <!-- 異常信息顯示 -->
- <c:if test="${!empty exception}"><s:property value="%{getText(exception.messageKey)}"/></c:if>
這樣異常信息就會被顯示了。