[Seasar-user:19369] Re: [ETDA0027]JSP 例外について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 2月 23日 (火) 18:00:15 JST


小林 (koichik) です.

Date:    23 Feb 2010 13:29:00 +0900
From:    "落合 あずみ" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:19368] Re: [ETDA0027]JSP 例外について

> ログに出力されていたスタックトレースは
> メールに記述したものだけだったのですが、
> デバッグで確認したところ、
> 
> ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
> 
> と出力されていました。
> 大元の原因とはこれのことでしょうか。

たぶんそれです.
が,それがスタックトレースに出てないのが気になります.
「デバッグで確認」というのはどういう意味でしょうか?
デバッガで確認?

ともあれ (JW),スタックトレースの

> >> Caused by: javax.servlet.jsp.JspException
> >> 	at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:190)

に該当する UIComponentTag のコードは

        } catch (final IOException e) {
            component = null;
            context = null;
            throw new JspException(e);

となっていて,ここでキャッチされたのが
ClientAbortException であるなら,

JspRuntimeException -> JspException ->
  ClientAbortException -> SocketException

という例外チェーンが作られます.
そうなれば,TeedaExtensionErrorPageManagerImpl は
この例外を無視するのですが,requestDumpFilter の
ログを見ると無視されていないようです.

こちらで Tomcat6 + Teeda HTML Example で
ブラウザ側で接続を切断してみたところ,スタック
トレースにはちゃんと ClientAbortException も 
SocketException も出力されていました.
上記で引用した JspException に相当する部分も

Caused by: javax.servlet.jsp.JspException: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
	at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:190)

となっており,原因となった例外のメッセージが
出力されます.

状況から考えると,UIComponentTag クラスが
書き換えられて,

        } catch (final IOException e) {
            component = null;
            context = null;
            throw new JspException();
                                   ^

となっていることくらいしか思いつかないのですが,
そんなことはないでしょうか?

念のため,デバッガで以下の確認をお願いします.

UIComponentTag クラスの 190 行目にブレーク
ポイントを付ける.
停止したら JspException のコンストラクタに
ステップインして,引数として原因となった例外が
渡されていることを確認.

HtmlViewHandler クラスの 159 行目にブレーク
ポイントを付ける.
停止したら Variables ビューで変数 ex を
展開して cause フィールドに設定されている
例外のクラスを確認.
cause フィールドを展開して,同じようにその
cause フィールドに設定されている例外クラスを
確認.
cause フィールドが null になるまで繰り返す.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内