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