<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title>例外処理</title>
    <link rel="stylesheet" href="/css/style.css" type="text/css" media="all" />
    
    
  </head>
  <body>
    <div class="header">
      <div id="pane.left-header" class="pane left">
        <div id="org.seasar.kvasir.cms.toolbox.customPop-2" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <div class="body"><div class="wiki">
<ul>
<li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
<li><a href="/download">ダウンロード</a></li>
<li><a href="/news/" class="pageNotFound">新着情報</a></li>
<li><a href="/docs/" class="pageNotFound">ドキュメント</a></li>
</ul>
</div>
</div>
        </div>
      </div>
      <div id="pane.right-header" class="pane right">
        <div id="org.seasar.kvasir.cms.toolbox.loginPop-1" class="pop org.seasar.kvasir.cms.toolbox.loginPop">
          <div class="body">
<form method="post" action="/plugins/toolbox/login.do/docs/0.9.x/ref/exceptionHandler">
    <div class="row">
      <span class="label">Name</span>
      <span class="textinput"><input type="text" name="name" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="label">Password</span>
      <span class="textinput"><input type="password" name="password" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="submit"><input type="submit" value="Login" /></span>
    </div>
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.loginUserPop-1" class="pop org.seasar.kvasir.cms.pop.loginUserPop">
          <div class="body"></div>
        </div>
      </div>
    </div>
    <div class="page-frame">
      <div id="pane.left-sidebar" class="pane sidebar-frame sidebar subcontent">
        <div id="org.seasar.kvasir.cms.toolbox.searchPop-1" class="pop org.seasar.kvasir.cms.toolbox.searchPop">
          <h2 class="title">Search</h2>
          <div class="body"><form class="simple" method="get" action="/plugins/toolbox/search.do">
  <input type="text" name="query" size="12" />
  <input type="submit" value="Go!" />
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.toolbox.customPop-1" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <h2 class="title">メニュー</h2>
          <div class="body"><ul>
  <li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
  <li><a href="/download">ダウンロード</a></li>
  <li><a href="/news">新着情報</a></li>
  
    
    
      <li>
        <a href="/docs/1.0.x">ドキュメント（1.0.x系）</a>
        
      </li><li>
        <a href="/docs/0.9.x">ドキュメント（0.9.x系）</a>
        
      </li>
    
  
  <li><a href="/roadmap">ロードマップ</a></li>
  <li><a href="https://www.seasar.org/issues/browse/YMIR">既知の不具合を閲覧する・不具合を報告する</a></li>
  <li><a href="https://www.seasar.org/svn/ymir/">SVNリポジトリ</a></li>
  <li><a href="http://svn.seasar.org/browse/?root=ymir">SVNリポジトリを閲覧</a></li>
</ul>
</div>
        </div>
      </div>
      <div id="pane.main" class="pane main">
      
        <div id="org.seasar.kvasir.cms.toolbox.breadcrumbsPop-1" class="pop org.seasar.kvasir.cms.toolbox.breadcrumbsPop">
          
          <div class="body"><ul>
  <li class="first"><a href="/">(TOP)</a></li><li><a href="/docs">ドキュメント</a></li><li><a href="/docs/0.9.x">ドキュメント（0.9.x系）</a></li><li><a href="/docs/0.9.x/ref">リファレンスマニュアル</a></li><li>例外処理</li>
</ul>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.contentPop-1" class="pop org.seasar.kvasir.cms.pop.contentPop">
          <h2 class="title">例外処理</h2>
          <div class="body">
<ul class="information">
  
  <li>2007-08-17 16:21:51</li>
</ul>
<div class="content"><div class="document">
<p>アプリケーションで例外が発生した場合の処理を制御するには、例外ハンドラの機構を使用します。</p>
<div class="section" id="e4be8be5a496e3838fe383b3e38389e383a9e381aee799bbe98cb2">
<h3><a name="e4be8be5a496e3838fe383b3e38389e383a9e381aee799bbe98cb2">例外ハンドラの登録</a></h3>
<p>例外ハンドラは<tt class="docutils literal"><span class="pre">org.seasar.ymir.handler.ExceptionHandler</span></tt>インタフェースを継承したクラスで、Seasarにコンポーネントとして登録しておく必要があります。</p>
<p>なお、アプリケーションのルートパッケージの下のhandlerパッケージの下にある「～Handler」という名前のクラスはYmirによって自動的にコンポーネント登録されます。他のパッケージに置いてあるハンドラクラスを登録する場合は手動で登録する必要があります。その際コンポーネント名は「対応する例外クラス名（パッケージ部分なし）をJavaBeansのプロパティ名化のルールに従って変換した文字列＋「Handler」として下さい（例：IllegalArgumentException → illegalArgumentExceptionHandler）。</p>
</div>
<div class="section" id="e4be8be5a496e3838fe383b3e38389e383a9e381aee68ea2e7b4a2">
<h3><a name="e4be8be5a496e3838fe383b3e38389e383a9e381aee68ea2e7b4a2">例外ハンドラの探索</a></h3>
<p>リクエストの処理中に例外<tt class="docutils literal"><span class="pre">E</span></tt>が発生した場合、Ymirは以下の順序で例外ハンドラを探します。</p>
<ol>
<li>Seasarから<tt class="docutils literal"><span class="pre">E</span></tt>に対応する例外ハンドラを探します。</li>
<li>見つからなくてかつ<tt class="docutils literal"><span class="pre">E</span></tt>のスーパークラスがExceptionまたはExceptionのサブクラスならば、<tt class="docutils literal"><span class="pre">E</span></tt>のスーパークラスに対応する例外ハンドラを探します。</li>
<li>2.の処理を再帰的に繰り返します。</li>
</ol>
</div>
<div class="section" id="e38387e38395e382a9e383abe38388e381aee4be8be5a496e3838fe383b3e38389e383a9">
<h3><a name="e38387e38395e382a9e383abe38388e381aee4be8be5a496e3838fe383b3e38389e383a9">デフォルトの例外ハンドラ</a></h3>
<p>例外ハンドラが見つからなかった場合はデフォルトの例外ハンドラが使用されます。デフォルトの例外ハンドラとその処理は以下のとおりです。</p>
<table border="1" class="docutils">
<colgroup>
<col width="33%" />
<col width="67%" />
</colgroup>
<thead valign="bottom">
<tr>
<th>例外</th>
<th>処理</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>PageNotFoundException</td>
<td>HTTPレスポンスにステータス404（Not Found）をセット</td>
</tr>
<tr>
<td>PermissionDeniedException</td>
<td>HTTPレスポンスにステータス403（Forbidden）をセット</td>
</tr>
<tr>
<td>その他</td>
<td>例外を再スロー</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="e4be8be5a496e3838fe383b3e38389e383a9e381aee591bce381b3e587bae38197">
<h3><a name="e4be8be5a496e3838fe383b3e38389e383a9e381aee591bce381b3e587bae38197">例外ハンドラの呼び出し</a></h3>
<p>例外ハンドラの呼び出しに先立って、Pageオブジェクトの場合と同じようにオブジェクトスコープからのオブジェクトのインジェクション処理が行なわれます。すなわち、@Inアノテーションが付与されているsetterメソッドがあれば、アノテーションに従ったオブジェクトスコープからオブジェクトが取り出されてsetterメソッドを使ってオブジェクトがセットされます。</p>
<p>次に例外ハンドラのhandleメソッドが呼び出されます。handleメソッドの引数にはスローされた例外オブジェクトが渡されます。</p>
<p>最後にオブジェクトスコープへのオブジェクトのアウトジェクション処理が行なわれます。すなわち、@Outアノテーションが付与されているgetterメソッドがあれば、アノテーションに従ったオブジェクトスコープにgetterメソッドの返り値が格納されます。</p>
<div class="section" id="e4be8be5a496e3838fe383b3e38389e383a9e381aee591bce381b3e587bae38197e5be8ce381aee981b7e7a7bb">
<h4><a name="e4be8be5a496e3838fe383b3e38389e383a9e381aee591bce381b3e587bae38197e5be8ce381aee981b7e7a7bb">例外ハンドラの呼び出し後の遷移</a></h4>
<p>リクエストの処理の流れが例外ハンドラに切り替えられると、パススルー先が<tt class="docutils literal"><span class="pre">/WEB-INF/template/exception/例外クラス名.html</span></tt>という画面に切り替えられます。ここでの例外クラス名はスローされた元々の例外クラスの名前ではなく、例外の処理を行なった例外ハンドラに対応する例外クラスの名前です。</p>
<p>handleメソッドの返り値はPageクラスのアクションメソッドと同じようにレスポンスを表すものとみなされますので、返り値として&quot;passthrough:&quot;という文字列を指定してパススルーさせた場合、<tt class="docutils literal"><span class="pre">/WEB-INF/template/exception/例外クラス名.html</span></tt>にフォワードすることになります。</p>
<p>また、例えばエラーページ<tt class="docutils literal"><span class="pre">/error.html</span></tt>にフォワードしたい場合はhandleメソッドの返り値を<tt class="docutils literal"><span class="pre">&quot;/error.html&quot;</span></tt>とすれば良いことになります。</p>
</div>
<div class="section" id="e38386e383b3e38397e383ace383bce38388e3818be38289e4be8be5a496e3838fe383b3e38389e383a9e382aae38396e382b8e382a7e382afe38388e38292e58f82e785a7e38199e3828b">
<h4><a name="e38386e383b3e38397e383ace383bce38388e3818be38289e4be8be5a496e3838fe383b3e38389e383a9e382aae38396e382b8e382a7e382afe38388e38292e58f82e785a7e38199e3828b">テンプレートから例外ハンドラオブジェクトを参照する</a></h4>
<p>例外ハンドラオブジェクトに持たせたエラーメッセージなどをフォワード先の画面で表示できるよう、例外の処理を行なった例外ハンドラオブジェクトをrequestスコープに<tt class="docutils literal"><span class="pre">handler</span></tt>という名前でバインドしています。</p>
</div>
</div>
</div>
</div>
</div>
        </div>
      
    </div>
    </div>
    <div class="footer-delimiter"></div>
    <div id="pane.footer" class="pane footer">
      <div id="org.seasar.kvasir.cms.pop.poweredByPop-1" class="pop org.seasar.kvasir.cms.pop.poweredByPop">
        <div class="body">Powered by Kvasir/Sora</div>
      </div>
    </div>
  </body>
</html>
