[seasar-dotnet:308] Re: [Seasar]MethodInvocationImpl.Proceed()のExceptionHandlingについて

Kazuya Sugimoto sugimotokazuya @ gmail.com
2006年 7月 20日 (木) 17:50:06 JST


杉本です。

久保さん、ご指摘ありがとうございます。修正したいと思います。

実際にStackTraceを見てみると、D案が良いような気がします。

少し処理が多くなりますが、位置的にはパフォーマンスを気にする所ではないので、
良いのではないでしょうか。

ちょっと裏技過ぎる気もしますが。

06/07/20 に kuboさんは書きました:
> 久保です。
>
> ちょっと優先度の高い修正を依頼したいです。
>
> MethodInvocationImpl.Proceed()において、
> method_.Invoke(target_, arguments_)の中で発生したExceptionを
> catchして、InnerExceptionをThrowしているところがあります。
>
>     try
>     {
>         // Interceptされたメソッドを実行する
>         return method_.Invoke(target_, arguments_);
>     }
>     catch (TargetInvocationException ex)
>     {
>         throw ex.InnerException; // ★ここ
>     }
>
> 現状発生している問題として、
> ExceptionのStackTraceが「★ここ」までで途切れてしまいます。
> (これは開発において重要です)
>
> 検証したところ、C#の文法では、この記述方法では
> StackTraceがどうしても途切れてしまうようです。
>
> 色々試した結果が以下です。
>
> <A> NG
>     } catch (TargetInvocationException e) {
>         throw e.InnerException;
>     }
>
> <B> OK ※というかcatchする意味ないけど
>     } catch (TargetInvocationException e) {
>         throw;
>     }
>
> <C> OK ※WrapExceptionを差し替えているだけ
>     } catch (TargetInvocationException e) {
>         throw new SystemException("xxx", e);
>     }
>
> <D> OK ※発生したExceptionをそのままThrowだが、超強引
>     } catch (TargetInvocationException e) {
>         // NB: Error checking etc. excluded
>         // Get the _remoteStackTraceString of the Exception class
>         FieldInfo remoteStackTraceString
>              = typeof(Exception).GetField("_remoteStackTraceString"
>                                         , BindingFlags.Instance
>                                           | BindingFlags.NonPublic);
>
>         // Set the InnerException._remoteStackTraceString
>         // to the current InnerException.StackTrace
>         remoteStackTraceString.SetValue(e.InnerException
>                                       , e.InnerException.StackTrace
>                                         + Environment.NewLine);
>
>         throw e.InnerException;
>     }
>   →これは以下のサイトを参考にしました。
> http://dotnetjunkies.com/WebLog/chris.taylor/archive/2004/03/03/8353.aspx
>
> 基本、TargetInvocationException を返さずに、本当の原因のException
> をthrowしたいと思いますが、StackTraceを失うのも相当つらいです。
> (Seasar利用是非の問題に関わってしまう)
>
> どれ(なにが)が正解とも言えなくて申し訳ないのですが、
> 何かしらの対策修正できませんでしょうか?
>
>
>
> --
> kubo <jazzflute @ mbn.nifty.com>
>
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://www.seasar.org/mailman/listinfo/seasar-dotnet
>


-- 
Kazuya Sugimoto
http://d.hatena.ne.jp/sugimotokazuya/


seasar-dotnet メーリングリストの案内