2012-07-11 11 views
7

मैं PowerShell के साथ एक अजीब समस्या का सामना कर रहा हूँ अंदर पॉप्युलेट नहीं। मैं कैच ब्लॉक में अपवाद पकड़ रहा हूं, लेकिन वैश्विक $ त्रुटि ऑब्जेक्ट पॉप्युलेट नहीं किया जा रहा है।

function Bar 
{ 
    Foo 
} 

function Foo 
{ 
    try 
    { 
    $Error.Clear() 
    throw "Error!" 
    } 
    catch 
    { 
    "Caught an error - current error count $($Error.Count)" 
    } 
    finally 
    { 
    "Cleaning up - current error count $($Error.Count)" 
    } 
} 

आउटपुट के रूप में आप अगर आप बार

Caught an error - current error count 1 
Cleaning up - current error count 1 

कोड रहा है में परेशानी आ रही फोन उम्मीद होती है:

एक तुच्छ उदाहरण के लिए जहां यह अपेक्षा के अनुरूप व्यवहार करेंगे यह है लगभग समान, सिवाय इसके कि यह एक मॉड्यूल से फू लोड करता है। अगर यह एक बग, या बस कुछ मुझे समझ नहीं आता (! कार्रवाई पुस्तक में मेरी Powershell जाँच करना होगा)

मैं एक मॉड्यूल के लिए रवाना फू सहेजते हैं है सुनिश्चित नहीं हैं - Foo.psm1

function Foo 
{ 
    try 
    { 
    $Error.Clear() 
    throw "Error!" 
    } 
    catch 
    { 
    "Caught an error - current error count $($Error.Count)" 
    } 
    finally 
    { 
    "Cleaning up - current error count $($Error.Count)" 
    } 
} 

Export-ModuleMember -Function Foo 

तो मैं निम्नलिखित

Import-Module .\Foo.psm1 
$Error.Clear() 
"Current error count $($Error.Count)" 
Foo 
"Current error count $($Error.Count)" 

मैं साथ

Current error count 0 
Caught an error - current error count 0 
Cleaning up - current error count 0 
Current error count 1 

सूचना है कि फू अब एक देखता अंत प्रदर्शन $ त्रुटि में किए गए परिवर्तन। तो कोड का मॉड्यूल-इफ़िकेशन त्रुटि प्रसार व्यवहार बदल रहा है। क्या कोई इस के पीछे तर्क के साथ झुका सकता है?

मैं नोट करना चाहिए कि मैं स्वत: चर $ _ के माध्यम से विशिष्ट पकड़ा अपवाद पर प्राप्त कर सकते हैं, लेकिन मैं कॉल स्टैक में इस बिंदु पर पूरे संग्रह पर भी नियंत्रण प्राप्त करने के लिए देख रहा हूँ।

+0

तो मेरी पहली रेखा से ऊपर गलत है .. वैश्विक $ त्रुटि संग्रह संशोधित किया गया है, लेकिन मॉड्यूल scoped $ त्रुटि संग्रह नहीं है। –

उत्तर

7

मुझे लगता है कि इससे पहले कि गौर नहीं किया था, लेकिन शायद $ त्रुटि संग्रह किसी अन्य चर की तरह मॉड्यूल के दायरे वाला। अपने परीक्षण लिपि में मुख्य बिंदुओं पर निम्नलिखित दो स्पष्ट रूप से scoped चरों के मान की तुलना का प्रयास करें:

"Errors - Global: {0}; Module: {1}" -f $global:error.count, $script:error.count 

मुझे पता है कि कैसे आप पर हो। त्रुटि त्रुटियों के सभी को देखने के लिए:

+0

वह $ error.clear() हो सकता है वैश्विक वैरिएबल को स्थानीय दायरे में कॉपी करता है और उसे साफ़ करता है। –

+0

एक तरह से मॉड्यूल दायरे में त्रुटि चर प्राप्त करने के लिए 'Get-चर -नाम त्रुटि -Scope 2' होगा। @Ethan, चूंकि आपके पास एक्शन में पीएस है, तो आप सेक्शन 9.4.5 सेक्शन देखना चाहते हैं। स्क्रिप्ट मॉड्यूल में कैसे स्कॉप्स काम करते हैं। –

+0

मैं अब एक छोटे से मूर्खतापूर्ण लग रहा है ... मैं इस समय जांच नहीं कर सकता है, लेकिन मुझे लगता है scoping संभावना यहां मुद्दा यह है। पूरी तरह से मेरे दिमाग फिसल गया (जो बदतर है, क्योंकि मेरे पास कुछ $ स्क्रिप्ट है: कोड में स्तर के युद्ध)! मैं 9.4.5 की जांच करूंगा - धन्यवाद एंडी!मुझे लगता है कि विशिष्टता यह होगी कि मॉड्यूल में $ त्रुटि तक पहुंचने के लिए उचित डिफ़ॉल्ट दायरा नहीं है - आखिरकार, अपवाद मॉड्यूल में सामने आया, इसलिए आपको लगता है कि $ त्रुटि उस सरणी को डिफ़ॉल्ट करेगी जहां मॉड्यूल त्रुटियां एकत्र की गई थीं । –

9

के रूप में एतान उल्लेख किया है, आप कम से $ वैश्विक देखने की जरूरत है। मॉड्यूल में हमेशा उनके पास $ त्रुटि चर होता है लेकिन यह (अधिकतर) उपयोग नहीं किया जाता है।

पृष्ठभूमि: एक बिंदु पर, हम त्रुटियों कि मॉड्यूल गुंजाइश के लिए मॉड्यूल कोड में हुई लेकिन अंत में वैश्विक त्रुटि संग्रह करने के लिए सभी त्रुटियों को जोड़ने का निर्णय लिया, क्योंकि यह अनिवार्य रूप से त्रुटियों की एक लॉग (एक में स्मृति की तरह है अलग माना जाता था eventlog।) दुर्भाग्यवश मॉड्यूल स्कॉप्ड $ त्रुटि को रिलीज़ से पहले हटाया नहीं गया था और इसलिए आपको "असली" $ त्रुटि चर का उपयोग करने के लिए वैश्विक स्कोप क्वालीफायर का उपयोग करने की आवश्यकता है।

ब्रूस Payette, माइक्रोसॉफ्ट कार्पोरेशन

+0

ब्रूस - ऐतिहासिक पृष्ठभूमि के लिए धन्यवाद। यह वही जानकारी है जिसे मैं ढूंढ रहा था। –

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