Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

例外処理

例外が発生した際、標準のエラー画面が表示され画面にプログラムのソースコードが表示されます。これは、セキュリティ上あまり好ましいことではありません。Struts例外処理を使用すると、例外が発生した際、指定した例外処理を行い指定したエラー画面を表示します。ここでは、Struts例外処理について解説します。

実行環境
  • ・WindowsXP Home Edition
  • ・J2SDK 1.4.2_04
  • ・Tomcat 5.0.18
  • ・Struts 1.2.4

基本処理

Strutsでは、struts-config.xmlの<global-exceptions>タグを使用して例外が発生した場合の例外処理を指定します。

  1. <global-exceptions>タグ内に<exception>タグを指定し、例外クラスごとの例外処理を指定します。
  2. <exception>タグでは、type属性にキャッチする例外クラス、key属性にメッセージ・リソースファイルに指定したエラーメッセージのキー、path属性に例外が発生した際に遷移するエラー画面を指定します。
  3. 例外が発生した際、<exception>タグのkey属性のエラーメッセージを保持したActionMessagesオブジェクトが生成されます。
  4. エラー画面のJSPで、ActionMessagesオブジェクトのエラーメッセージを<html:messages>タグを使用して表示します。

アクション・クラスで例外が発生した場合の例外処理について解説します。

【exException.jsp】「送信」ボタンを一つだけもち、アクション・クラスへ処理を遷移させるJSPプログラムです。今回は何の処理も行いません。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html>
<head><title>例外処理</title></head>
<body>

<html:form action="/ExException">
    <html:submit property="submit" value="送信"/>
</html:form>

</body>
</html:html>

【ExExceptionForm.java】アクション・フォームBeanです。今回は何の処理も行いません。

package struts;

import org.apache.struts.action.*;

public final class ExExceptionForm extends ActionForm {
}

【ExExceptionAction.java】アクション・クラスです。0で除算を行い例外を発生させています。

package struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;

public final class ExExceptionAction extends Action {
    //(1)throws Exceptionを指定
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res) throws Exception {
        //(2)0で除算して、例外を発生させる
        int discount = 100/0;
        return (mapping.findForward("info"));
    }
}
  1. (1)throws Exceptionを指定し、executeメソッド内で発生した例外をスローします。
  2. (2)0で除算し、例外ArithmeticExceptionを発生させます。

【error.jsp】例外が発生した際に遷移するJSPプログラムです。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html:html>
<head><title>エラー画面</title></head>
<body>

エラーメッセージ
<br>
<%-- (1)ActionMessagesオブジェクトのエラーメッセージを表示 --%>
<html:messages id="msg" message="false">
    <bean:write name="msg" ignore="true"/>
</html:messages>

</body>
</html:html>
  1. (1)<html:messages>タグで、ActionMessagesオブジェクトに登録されたエラーメッセージを表示します。message属性がfalseの場合はエラーメッセージを表示することを表します。<bean:write>タグのignore属性をtrueにしている場合は、メッセージがない場合は何も表示されません。

【application.properties】メッセージ・リソースファイルです。

error.msg1=ArithmeticException Error! Please inform administrator.
error.msg =Exception Error! Please inform administrator.

【struts-config.xml】struts-config.xmlファイルです。例外が発生した際の動作を指定します。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

    <form-beans>
        <form-bean name="ExException"
                   type="struts.ExExceptionForm" />
    </form-beans>

    <!-- (1)例外処理を指定 -->
    <global-exceptions>
        <!-- (2)ArithmeticException例外が発生した際の処理を指定 -->
        <exception type="java.lang.ArithmeticException"
                   key="error.msg1"
                   path="/error.jsp"/>
        <!-- (3)Exception例外が発生した際の処理を指定 -->
        <exception type="java.lang.Exception"
                   key="error.msg"
                   path="/error.jsp"/>
    </global-exceptions>

    <action-mappings>
        <action path="/ExException"
                    type="struts.ExExceptionAction"
                    name="ExException"
                    scope="request">
            <forward name="info" path="/exException2.jsp"/>
        </action>
    </action-mappings>

    <!-- (4)メッセージ・リソースファイルを指定 -->
    <message-resources parameter="resources.application"/>

</struts-config>
  1. (1)<global-exceptions>タグで例外が発生した際の処理を指定します。例外ごとの処理は<exception>タグで指定します。<exception>タグは上から順に実行されるため、例外の範囲が少ない順に例外を指定します。
  2. (2)<exception>タグのtype属性にArithmeticExceptionを指定し、例外ArithmeticExceptionが発生した際の処理を指定します。例外が発生した際、key属性で指定したエラーメッセージを保持し、path属性に指定したerror.jspページに遷移します。
  3. (3)<exception>タグのtype属性にExceptionを指定し、ArithmeticException以外の例外が発生した際の処理を指定します。例外が発生した際、key属性で指定したエラーメッセージを保持し、path属性に指定したerror.jspページに遷移します。
  4. (4)エラーメッセージが記載されているメッセージ・リソースファイルを指定します。

【実行例】プログラムの実行例です。「送信」ボタンをクリックするとアクション・クラスが実行され、例外が発生、例外処理が行われていることがわかります。

Struts実行結果_1
Struts実行結果_2

応用処理

1. 例外処理クラスを指定

<exception>タグのhandler属性を指定することで例外が発生した際に実行されるクラスを指定することができます。例外が発生した際、何らかの特別な処理を行いたいときにhandler属性を使用します。

<exception>タグにhandler属性を指定

<global-exceptions>
<!-- 例外処理クラスException01クラスを指定 -->
<exception type="java.lang.ArithmeticException"
           key="error.msg1"
           path="/error.jsp"
           handler="struts.exception.Exception01/>
・・・・・
・・・・・
</global-exceptions>

2. 特定のアクション内の例外処理を指定

<action>タグ内に<exception>タグを指定することで、特定のアクションに限定した例外処理を指定することができます。

<action>タグ内に<exception>タグを指定

・・・・・
<action-mappings>
    <action path="/ExException"
            type="struts.ExExceptionAction"
            name="ExException"
            scope="request">
        <!-- <action>タグ内に<exception>タグを指定 -->
        <exception type="java.lang.ArithmeticException"
                   key="error.msg1"
                   path="/error.jsp"/>

        <forward name="info" path="/exException2.jsp"/>
    </action>
</action-mappings>
・・・・・

16例外処理