[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 メーリングリストの案内