2011-01-14 13 views
7

इन दो साधारण नमूनों को चलाने के दौरान मुझे कंसोल पर मुद्रित त्रुटि संदेश क्यों मिलता है?पावरशेल 2.0 और अपवादों को कैसे संभालें?

प्राप्त करें-WmiObject: मुझे लगता है कि मैं "त्रुटि परीक्षण :)" के insted कंसोल पर मुद्रित चाहते RPC सर्वर उपलब्ध नहीं है। (HRESULT से अपवाद: 0x800706BA) लाइन पर: 3 चार: 15 + Get-WmiObject < < < < -ComputerName possibly.nonexisting.domain.com -Credential (Get-क्रेडेंशियल) कक्षा Win32_logicaldisk + CategoryInfo: InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId: GetWMICOMException, Microsoft.PowerShell.Commands.GetWmiObjectCommand

या

शून्य से विभाजित करने का प्रयास किया। लाइन पर: 3 चार: 13 + $ i = 1/< < < + CategoryInfo: NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: RuntimeException

पहले उदाहरण:

try 
{ 
    $i = 1/0 
    Write-Host $i  
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

दूसरा उदाहरण:

try 
{ 
    Get-WmiObject -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

बहुत बहुत धन्यवाद!

उत्तर

11

पहले उदाहरण

संकलन/पार्स समय त्रुटि होता है (PowerShell काफी चालाक है), तो यह है कि कोड भी क्रियान्वित नहीं है और यह कुछ भी पकड़ नहीं सकता है, वास्तव में। बजाय इस कोड का प्रयास करें और आप एक अपवाद पकड़ लेंगे:

try 
{ 
    $x = 0 
    $i = 1/$x 
    Write-Host $i 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

दूसरा उदाहरण आप $ErrorActionPreference = 'Stop' सेट

तो विश्व स्तर पर तो आपको "त्रुटि परीक्षण :)" मिल जाएगा मुद्रित, अपेक्षा के अनुरूप। लेकिन आपके $ErrorActionPreference संभवतः 'Continue' है: उस स्थिति में कोई त्रुटि त्रुटि/अपवाद नहीं है और आप इंजन द्वारा मेजबान को मुद्रित गैर-टर्मिनल त्रुटि संदेश प्राप्त करते हैं।

वैश्विक $ErrorActionPreference विकल्प के बजाय आप Get-WmiObject पैरामीटर ErrorAction के साथ भी खेल सकते हैं। इसे Stop पर सेट करने का प्रयास करें और आप अपवाद प्राप्त करेंगे।

try 
{ 
    Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 
+0

तो यदि $ ErrorActionPreference 'जारी रखें' (जो डिफ़ॉल्ट है) पर सेट है तो आपको केवल त्रुटि संदेश मुद्रित किया गया है और स्क्रिप्ट मानक जारी है? – Primoz

+0

और यदि $ ErrorActionPreference 'स्टॉप' पर सेट है तो स्क्रिप्ट निष्पादन पहले अनचाहे अपवाद पर बंद हो जाएगा? – Primoz

+1

हां, बिल्कुल।निजी तौर पर, मुझे यह डिफ़ॉल्ट विकल्प उलझन में और थोड़ा खतरनाक लगता है: इससे अप्रत्याशित निरंतरताएं हो सकती हैं। मैं डिफ़ॉल्ट रूप से 'रोक' पसंद करूंगा, और यही वह है जो मैं अपने पीएस प्रोफाइल में पहले करता हूं। –

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