[Seasar-user:16605] Re: ThrowsInterceptor で例外発生箇所を特定するには

kubo [E-MAIL ADDRESS DELETED]
2009年 1月 7日 (水) 15:14:30 JST


久保(jflute)です。

海野さんの「Serviceで例外が発生した場合」ってのが
「Serviceクラスの中でthrow new Xxx()した場合」だから
じゃないでしょうか?
黒川さんがターゲットとしているのは
「Serviceクラスが呼び出す先のAPIが例外をthrowした場合」
だと思うのでそこがちょっと食い違ってたりしないですかね?

StackTraceElementの配列を辿っていって、
「serviceパッケージのServiceで終わるクラスで呼び出しが最初もの」
を探すことで汎用的に取得できるようになるかと思います。
DBFluteで似たようなことしてて、デバッグレベルに限っていますが、
デバッグログやSQL例外発生時にStackTraceElementから
呼び出し元のBehaviorやServiceのメソッドと行数を探して表示しています。
参考クラス:
allcommon.bhv.core.BehaviorCommandInvoker
allcommon.helper.stacktrace.impl.InvokeNameExtractorImpl
但し、やはり強引さは否めないので本番運用時に適用する場合は、
この処理自体で発生する例外を慎重に扱う必要があるかと思います。


2009/1/7 黒川博之 <[E-MAIL ADDRESS DELETED]>:
> 海野様
>
>> ちなみに、こちらではTeedaでPageクラスの
>> do*,initialize,prerenderメソッドに対して仕掛けていますが、
>> Pageから呼んだServiceで例外が発生した場合
>> そのServiceのクラス名とメソッド名が取れています。
>
> Teedaはそうなっているんですか??
>
> とりあえず、ひが様から頂いたアドバイスを元に色々と考えてみます。
>
> ありがとうございました。
>
>
> ----- Original Message ----- From: <[E-MAIL ADDRESS DELETED]>
> To: <[E-MAIL ADDRESS DELETED]>
> Sent: Wednesday, January 07, 2009 12:00 PM
> Subject: [Seasar-user:16599] Re: ThrowsInterceptor で例外発生箇所を特定するには
>
>
>> あらら、そうですか。。
>>
>> ちなみに、こちらではTeedaでPageクラスの
>> do*,initialize,prerenderメソッドに対して仕掛けていますが、
>> Pageから呼んだServiceで例外が発生した場合
>> そのServiceのクラス名とメソッド名が取れています。
>>
>> 海野
>>
>>
>>> 海野様
>>>
>>>>   StackTraceElement err = e.getStackTrace()[0];
>>>>   err.getClassName();
>>>>   err.getMethodName();
>>>
>>> System.out.println(err.getClassName());
>>> System.out.println(err.getMethodName());
>>>
>>> すると、これらが出力されました。
>>> org.seasar.framework.util.PreparedStatementUtil
>>> executeUpdate
>>>
>>> フレームワークのクラス/メソッドのようですね。
>>>
>>>
>>>
>>> ----- Original Message -----
>>> From: <[E-MAIL ADDRESS DELETED]>
>>> To: <[E-MAIL ADDRESS DELETED]>
>>> Sent: Wednesday, January 07, 2009 11:39 AM
>>> Subject: [Seasar-user:16595] Re: ThrowsInterceptor で例外発生箇所を特定する
>>> には
>>>
>>>
>>>> 海野です。
>>>>
>>>> もう1つだけ思いついたので、、
>>>>
>>>>   public void handleThrowable(RuntimeException e, MethodInvocation
>>>> invocation) throws Throwable {
>>>>
>>>> メソッド内で
>>>>
>>>>   StackTraceElement err = e.getStackTrace()[0];
>>>>   err.getClassName();
>>>>   err.getMethodName();
>>>>
>>>> というのはどうでしょうか。
>>>>
>>>>
>>>>> ひがです。
>>>>>>
>>>>>> 返答ありがとうございます。
>>>>>>
>>>>>> >getTargetClass(invocation).getName()
>>>>>> >invocation.getMethod().getName()
>>>>>> これだと、ThrowsInterceptorが適用されているactionクラス名とメソッド名
>>>>>> が取得されてしまうようです。
>>>>>>
>>>>>> 独自例外を定義して、そのクラスにクラス名とメソッド名のプロパティを
>>>>>> Stringで持たせて、catch句でクラス名とメソッド名をセットするしか
>>>>>> 無いですかね。。。
>>>>>> *そうなると、全ての箇所にtry catchを書く必要があるから、AOPの威力が魅力が落ちそうな予感。。。
>>>>>>
>>>>> ServiceのすべてのメソッドにInterceptorをしかけて、
>>>>> そこでThreadLocalにクラス名とメソッド名を格納し、
>>>>> ThrowsInterceptorで取り出すという方法もあります。
>>>>> _______________________________________________
>>>>> Seasar-user mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>>
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>>
>>
>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


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