2015-11-13 5 views
5

MSDN के अनुसार, Environment.StackTraceArgumentOutOfRangeException फेंक सकता है लेकिन मुझे नहीं पता कि यह कैसे संभव है।पर्यावरण कैसे हो सकता है। स्टैकट्रेस 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) कहने की गारंटी है।

लेकिन StackTrace(bool)MSDN के अनुसार कोई अपवाद नहीं फेंकता है। अन्य संभावित कन्स्ट्रक्टर कॉल, StackTrace(Exception, bool) (MSDN) एक अपवाद फेंकता है, लेकिन यह ArgumentNullExceptionArgumentOutOfRangeException नहीं है। मुझे कोड में किए गए किसी अन्य विधि कॉल को नहीं देखा गया है जो ArgumentOutOfRangeException फेंक देगा।

तो मुझे क्या याद आ रही है? क्या यह वास्तव में Environment.StackTrace के लिए अपवाद फेंकने के लिए संभव है और यदि ऐसा है तो कैसे?

+0

मुझे पता है कि 'नया स्टैकट्रेस (int)' ऐसा कर सकता है, लेकिन यह सुनिश्चित नहीं है कि यह 'पर्यावरण। स्टैकट्रेस' पर प्रचार कैसे करेगा। शायद ये कुछ स्वचालित उपकरण से दिखाए जाते हैं। https://msdn.microsoft.com/en-us/library/wybch8k4(v=vs.110).aspx – leppie

+0

@leppie मैंने यह भी देखा, 'skipframes' का उपयोग करने वाली विधियां 'Stacktrace.cs' में एकमात्र स्थान थीं जो 'ArgumentOutOfRangeException' फेंक देगा, लेकिन जहां तक ​​मैं सीधे 'Environment.StackTrace' से किए गए कॉल देख सकता हूं,' skipFrames' पैरामीटर का उपयोग करने वाली किसी भी विधि को हिट नहीं करता है। – Adam

+0

एमएसडीएन लेखों में अपवाद जानकारी सामान्य अविश्वसनीय है। यह हमेशा अधूरा होता है और कॉपी/पेस्ट कीड़े से पीड़ित होता है। उन लेखों को ठीक करना मुश्किल है, अगर किसी को कभी भी अपवाद का सामना नहीं करना पड़ता है तो कोई भी कभी भी एक दस्तावेज अपवाद को हटाने के लिए नहीं सोचता है। –

उत्तर

3

वास्तव में संपत्ति मूल्य को पुनर्प्राप्त करना अपवाद नहीं फेंकना चाहिए। हमने Environment.StackTrace property के लिए दस्तावेज़ से अपवाद जानकारी हटा दी है।

2

स्रोत कोड पढ़ना मैं सहमत हूं कि ArgumentOutOfRangeException को पर्यावरण से कोड पथ पर कभी नहीं फेंकना चाहिए। स्टैकट्रेस।

यह पहली बार नहीं होगा जब एमएसडीएन को सुधार की आवश्यकता हो। आपको "कोई सुझाव?" पर क्लिक करना चाहिए ऊपरी दाएं लिंक। जवाब देने के बाद "क्या पृष्ठ सहायक था? हाँ/नहीं", वे किसी भी अन्य प्रतिक्रिया के लिए संकेत देंगे।

संबंधित मुद्दे