MSDNによれば、Environment.StackTrace
はArgumentOutOfRangeException
を投げることができますが、これはどのように可能かわかりません。Environment.StackTraceはどのようにArgumentOutOfRangeExceptionをスローすることができますか?
Environment.cs StackTrace
(source)Exception
がnull
public static String StackTrace {
[System.Security.SecuritySafeCritical]
get {
Contract.Ensures(Contract.Result<String>() != null);
new EnvironmentPermission(PermissionState.Unrestricted).Demand();
return GetStackTrace(null, true);
}
}
コールGetStackTrace(Exception, bool)
。
Environment.cs GetStackTrace(Exception, bool)
(source)(コメント除去し、それらは無関係である)
internal static String GetStackTrace(Exception e, bool needFileInfo)
{
StackTrace st;
if (e == null)
st = new StackTrace(needFileInfo);
else
st = new StackTrace(e, needFileInfo);
return st.ToString(System.Diagnostics.StackTrace.TraceFormat.Normal);
}
上記方法はStackTrace
、StackTrace(bool)
とStackTrace(Exception, bool)
の2つのコンストラクタを呼び出す可能性を有します。
最初の呼び出しから、Environment.StackTrace
呼び出しによってこのメソッドに到達すると、StackTrace(bool)
が呼び出されることが保証されています。
しかし、StackTrace(bool)
は、MSDNに従って例外をスローしません。他のコンストラクタコール、StackTrace(Exception, bool)
(MSDN)は例外をスローしますが、ArgumentNullException
ではなくArgumentOutOfRangeException
です。私はArgumentOutOfRangeException
を投げるコードで他のメソッド呼び出しを見ていません。
私は何が欠けていますか? Environment.StackTrace
が実際に例外をスローすることは可能ですか?
私は 'new StackTrace(int)'がこれを行うことができますが、 'Environment.StackTrace'にどのように伝播するかはわかりません。おそらく、これらはいくつかの自動ツールから表示されます。 https://msdn.microsoft.com/en-us/library/wybch8k4(v=vs.110).aspx – leppie
@leppie「skipFrames」を使ったメソッドだけが 'Stacktrace.cs'の唯一の場所であることにも気付きました。それは 'ArgumentOutOfRangeException'を投げますが、' Environment.StackTrace'から直接行った呼び出しが 'skipFrames'パラメータを使用するメソッドに当たらないことがわかりました。 – Adam
MSDNの記事の例外情報は一般的ではありません。それは常に不完全で、コピー/ペーストのバグに悩まされます。誰も例外に遭遇したことがないなら、誰も文書化された例外を*削除*することを考えていないとすれば、それらの記事を修正するのは難しいです。 –