根據MSDN,Environment.StackTrace
可以拋出ArgumentOutOfRangeException
,但我不明白這是如何可能的。Environment.StackTrace如何拋出ArgumentOutOfRangeException?
Environment.cs StackTrace
(source)
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)
其中Exception
爲空。
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)
兩個構造的潛力。
我們從第一次通話知道,如果通過Environment.StackTrace
呼叫達到此方法,則保證調用StackTrace(bool)
。根據MSDN,StackTrace(bool)
不會拋出任何異常。另一個可能的構造函數調用StackTrace(Exception, bool)
(MSDN)確實會拋出異常,但它不是ArgumentNullException
而不是ArgumentOutOfRangeException
。我沒有看到任何其他方法調用在代碼中會拋出ArgumentOutOfRangeException
。
那麼我錯過了什麼? Environment.StackTrace
實際上可能拋出異常,如果是這樣的話?
我知道'新的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文章中的異常信息通常不可靠。它總是不完整的,並且受到複製/粘貼錯誤的影響。很難得到那些固定的文章,如果沒有人遇到過這種異常,那麼沒有人會認爲*刪除*記錄的異常。 –