3.1 独自例外ページ作成方法

移転しました。

AndroMDA3.1 では独自例外ページを作成したためメモっておく。

本来ならモデル上で例外フローを書けばよいのだが、煩雑になり図も醜くなるためソース中で例外発生処理を書き、Strutsの機能を利用しそれを受け取るようにした。

参考URL
http://hondou.homedns.org/pukiwiki/pukiwiki.php?cmd=read&page=Struts%20%CE%E3%B3%B0%A5%CF%A5%F3%A5%C9%A5%E9

Exception関連クラス作成

SystemException

例外クラス

public class SystemException extends RuntimeException{
	   private String errid;
	   private String[] msgs;
	   
	   public String getErrid(){ return errid; }
	   public String[] getMsgs(){ return msgs; }
	   
	   public SystemException(String pErrid){
	     super(pErrid);
	     errid = pErrid;
	   }
	 
	   public SystemException(String pErrid, String[] pMsgs){
	     super(pErrid);
	     errid = pErrid;
	     msgs = pMsgs;
	   }
	 
	   public SystemException(String pErrid, String[] pMsgs, Throwable cause){
	     super(pErrid,cause);
	     errid = pErrid;
	     msgs = pMsgs;
	   }
	   
	   public SystemException(String pErrid, String msg1){
	     this(pErrid, new String[]{msg1});
	   }
	 
	   public SystemException(String pErrid, String msg1, Throwable cause){
		   this(pErrid, new String[]{msg1}, cause);
	   }
}
SystemExceptionHandler

例外ハンドラー

public class SystemExceptionHandler extends ExceptionHandler{
	   public ActionForward execute(
	     Exception ex,
	     ExceptionConfig ae,
	     ActionMapping mapping,
	     ActionForm formInstance,
	     HttpServletRequest request,
	     HttpServletResponse response)
	     throws ServletException {
	   
	     ActionForward forward = null;
	     ActionMessage error = null;
	     String property = null;
	     
	     // Build the forward from the exception mapping if it exists
	     // or from the form input
	     if (ae.getPath() != null) {
	       forward = new ActionForward(ae.getPath());
	     } else {
	       forward = mapping.getInputForward();
	     }
	     
	     // Figure out the error
	     if (ex instanceof ModuleException) {
	       error = ((ModuleException) ex).getActionMessage();
	       property = ((ModuleException) ex).getProperty();
	    } else if (ex instanceof SystemException) {
	      error = new ActionMessage(((SystemException) ex).getErrid(), ((SystemException) ex).getMsgs());
	      property = error.getKey();
	     } else {
	       error = new ActionMessage(ae.getKey(), ex.getMessage());
	       property = error.getKey();
	     } 
	   
	     this.logException(ex);
	   
	     // Store the exception
	     request.setAttribute(Globals.EXCEPTION_KEY, ex);
	     this.storeException(request, property, error, forward, ae.getScope());
	   
	     return forward;
	   }
	 }

設定ファイルとのマージ

WebMergeMappings.xml

各種設定ファイルとのマージファイル

    :
    :
    <mapping>
        <from><![CDATA[<!-- global-exceptions merge point -->]]></from>
        <to>
            <![CDATA[
           <exception
            type="hoge.exception.SystemException"
            path="/hoge/error-get-data.jsp"
            key="errors.system.getdata"
            handler="hoge.exception.SystemExceptionHandler" />
            ]]>
        </to>
    </mapping>
     :
     :
    <mapping>
        <from><![CDATA[# custom-messages merge-point]]></from>
        <to>
            <path>../../../web/src/properties/custom-resources.properties</path>
        </to>
    </mapping>
    :
    :

表示

JSP
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ include file="/taglib-imports.jspf" %>

<tiles:insert definition="main.layout">

    <tiles:put name="style" type="string">
        <link rel="stylesheet" type="text/css" media="screen" href="<html:rewrite page="/hoge/error-get-data.css"/>"></link>
    </tiles:put>

    <tiles:put name="body" type="string">

        <div>
            <h1>不正な操作を行いました。</h1>
        </div>


        <div id="pageHelpSection">
            <blockquote>
            </blockquote>
        </div>

    </tiles:put>

</tiles:insert>
custom-resources.properties

メッセージプロパティファイル

errors.system.getdata=エラーが発生しました。

実装クラス

hoge.java

実際に例外を発生するクラス

     // どこかの処理でthrow
     throw new SystemException("errors.system.getdata");