[Seasar-user:481] 例外の出方の改善案

B gluegent.com Masataka Kurihara kurihara
2004年 3月 17日 (水) 11:39:43 JST


栗原です。
EA3でXML設定を利用していろいろテストしてみました。以下、まとめきって
ませんが五月雨にエラーパターンと対応案をあげてあります。動き的な仕様
の問題は、最後の13)だけで、あとは例外の出方の改善案です。思いつく
パターンを列挙する中、「これはOK。」もあります。半分はすでにOKですね。

----------------------------------------------------------------------------
1)String型の引数がひとつあるコンストラクタを持つクラスで、<arg>設定が一つ
    もなかったとき
org.seasar.framework.exception.lang.NoSuchMethodRuntimeException:
[ESSR0057]クラス(org.seasar.extention.SpeakerImpl)のメソッド(<<init>>())
が見つかりません
at org.seasar.framework.util.reflect.ClassUtil.getConstructor
(ClassUtil.java:86)

#NoSuchMethodRuntimeException ではなくNoSuchConstructorRuntimeException 新設?
#メッセージで「<<init>>」ではなく、クラス名を入れてほしい。



2)String型の引数がひとつあるコンストラクタを持つクラスで、<arg>設定を一つ
    だけ、値はStringではなく、数を渡したとき
org.seasar.framework.beans.ConstructorNotFoundRuntimeException:
[ESSR0048]org.seasar.extention.SpeakerImplに引数(java.lang.Integer)で適用可能
なコンストラクタが見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getSuitableConstructor
(BeanDescImpl.java:122)

#これはOK。



3)String型の引数がひとつあるコンストラクタを持つクラスで、コンストラクタに
    Stringを二つ<arg>で渡したとき
org.seasar.framework.beans.ConstructorNotFoundRuntimeException:
[ESSR0048]org.seasar.extention.SpeakerImplに引数
(java.lang.String, java.lang.String)で適用可能なコンストラクタが見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getSuitableConstructor
(BeanDescImpl.java:122)

#これはOK。



4)プロパティで初期化するときにname属性に無いプロパティを指定したとき
java.lang.NullPointerException
at org.seasar.framework.container.assembler.property.
ManualPropertyAssembler.assemble(ManualPropertyAssembler.java:46)

#PropertyNotFoundRuntimeException 新設?
#メッセージで、その設定をミスしたnameを表示してほしい。



5)int 型のプロパティに数値に変換できない文字列を渡したとき
java.lang.NumberFormatException: For input string: "kurihara"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Source)
at org.seasar.framework.util.conversion.IntegerConversionUtil.toInteger
(IntegerConversionUtil.java:22)

#IllegalPropertyValueRuntimeException 新設?
#メッセージで設定しようとしたコンポーネント名・プロパティ名と値文字列
  を表示してほしい。



6)int型の引数をひとつもつinitMethodに引数を渡さなかったとき
org.seasar.framework.beans.MethodNotFoundRuntimeException:
[ESSR0049]org.seasar.extention.SpeakerImplに適用可能なメソッド
(setAge())が見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getSuitableMethod
(BeanDescImpl.java:282)

#これはOK。



7)int型の引数をひとつもつinitMethodにString型の引数を渡したとき
java.lang.NumberFormatException: For input string: "kuri"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Source)
at org.seasar.framework.util.conversion.IntegerConversionUtil.toInteger
(IntegerConversionUtil.java:22)

#IllegalMethodArgumentRuntimeException 新設?
#メッセージでコンポーネント名・呼び出そうとしたメソッド名・値文字列
  を表示してほしい。



8)initMethodの名前を間違えたとき
org.seasar.framework.beans.MethodNotFoundRuntimeException:
[ESSR0049]org.seasar.extention.SpeakerImplに適用可能なメソッド
(setAg())が見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getMethods
(BeanDescImpl.java:253)

#これはOK。



9)Aspect設定で、指定したコンポーネント名が間違っていたとき
org.seasar.framework.container.ComponentNotFoundRuntimeException:
[ESSR0046]コンポーネント(testAdvic)が見つかりません
at org.seasar.framework.container.impl.S2ContainerImpl.getComponentDef0
(S2ContainerImpl.java:114)

#AroundAdviceNotFoundRuntimeException 新設のほうが易しいか?
#適用しようとしたコンポーネントおよび設定文字列の表示をしてほしい。



10)インターフェイス二つの引数を持つコンストラクタに、一つ
      だけ引数を渡したとき(多いときも同じ)
org.seasar.framework.beans.ConstructorNotFoundRuntimeException:
[ESSR0048]org.seasar.extention.SpeakerManagerImplに引数
(org.seasar.extention.TestAdvice)で適用可能なコンストラクタが見つかりません
at org.seasar.framework.beans.impl.BeanDescImpl.getSuitableConstructor
(BeanDescImpl.java:122)

#これはOK。



11)AUTOモードになる状況で、インターフェイスでなく、実装クラスを引数
      とするコンストラクターのみの場合
org.seasar.framework.exception.lang.NoSuchMethodRuntimeException:
[ESSR0057]クラス(org.seasar.extention.SpeakerManagerImpl)のメソッド
(<<init>>())が見つかりません
at org.seasar.framework.util.reflect.ClassUtil.getConstructor
(ClassUtil.java:86)

#1)と同じ。



12)initMethodがインターフェイスを引数として取るときに、<arg>のコンポーネント
      の名前が間違っているとき
org.seasar.framework.container.IllegalMethodConfigurationRuntimeException:
[ESSR0060]クラス(org.seasar.extention.SpeakerManagerImpl)のメソッド
(setAroundAdvice)の設定に失敗しました。
理由はorg.seasar.framework.container.ComponentNotFoundRuntimeException:
[ESSR0046]コンポーネント(testAdvic)が見つかりません
at org.seasar.framework.container.assembler.method.
DefaultInitMethodAssembler.assemble(DefaultInitMethodAssembler.java:38)

#これはOK。



13)<arg>なしのAUTOモードで動かしながら、プロパティをセットしたとき
org.seasar.framework.exception.lang.NoSuchMethodRuntimeException:
[ESSR0057]クラス(org.seasar.extention.SpeakerManagerImpl)のメソッド
(<<init>>())が見つかりません
at org.seasar.framework.util.reflect.ClassUtil.getConstructor
(ClassUtil.java:86)

#これは、エラーでなく、普通に動いてほしい。


--
株式会社グルージェント
栗原 傑享(くりはら まさたか)
渋谷区渋谷3-7-6 第6矢木ビル4F
TEL:03-5469-8869 FAX:03-5469-8879
URL:http://www.gluegent.com/
--





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