2015-11-13 55 views
5

根據MSDNEnvironment.StackTrace可以拋出ArgumentOutOfRangeException,但我不明白這是如何可能的。Environment.StackTrace如何拋出ArgumentOutOfRangeException?

Environment.cs StackTracesource

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); 
} 

上述方法具有調用StackTraceStackTrace(bool)StackTrace(Exception, bool)兩個構造的潛力。

我們從第一次通話知道,如果通過Environment.StackTrace呼叫達到此方法,則保證調用StackTrace(bool)。根據MSDNStackTrace(bool)不會拋出任何異常。另一個可能的構造函數調用StackTrace(Exception, bool)MSDN)確實會拋出異常,但它不是ArgumentNullException而不是ArgumentOutOfRangeException。我沒有看到任何其他方法調用在代碼中會拋出ArgumentOutOfRangeException

那麼我錯過了什麼? Environment.StackTrace實際上可能拋出異常,如果是這樣的話?

+0

我知道'新的StackTrace(int)'可以做到這一點,但不知道它將如何傳播到'Environment.StackTrace'。也許這些從一些自動化工具中顯示出來。 https://msdn.microsoft.com/en-us/library/wybch8k4(v=vs.110).aspx – leppie

+0

@leppie我也注意到,使用'skipFrames'的方法是'Stacktrace.cs'中唯一的地方這會拋出'ArgumentOutOfRangeException',但據我所見,直接從'Environment.StackTrace'進行的調用不會觸及任何使用'skipFrames'參數的方法。 – Adam

+0

MSDN文章中的異常信息通常不可靠。它總是不完整的,並且受到複製/粘貼錯誤的影響。很難得到那些固定的文章,如果沒有人遇到過這種異常,那麼沒有人會認爲*刪除*記錄的異常。 –

回答

2

閱讀源代碼我同意不應該從Environment.StackTrace的代碼路徑拋出ArgumentOutOfRangeException。

這不是MSDN第一次需要更正。你應該點擊「任何建議?」鏈接在右上角。在回答「頁面是否有幫助?是/否」後,他們會提示您提供任何其他反饋。

相關問題