[seasar-dotnet:307] [Seasar]MethodInvocationImpl.Proceed()のExceptionHandlingについて
kubo
jazzflute @ mbn.nifty.com
2006年 7月 20日 (木) 13:50:38 JST
久保です。
ちょっと優先度の高い修正を依頼したいです。
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 メーリングリストの案内