2016-07-17 10 views
18
Invoke-WebRequest $sumoApiURL -Headers @{"Content-Type"= "application/json"} -Credential $cred -WebSession $webRequestSession -Method post -Body $sumojson -ErrorAction Stop 

यह निम्न अपवाद फेंकता है: "। इसी नाम के एक संसाधन पहले से ही मौजूद"पकड़ने पूर्ण अपवाद संदेश

enter image description here

मैं कैसे यह पूरी तरह से या कम से कम पकड़ कर सकते हैं को फ़िल्टर?

$_.Exception.GetType().FullName का उपयोग पैदावार

System.Net.WebException

और $_.Exception.Message

The remote server returned an error: (400) Bad Request.

उत्तर

37

त्रुटियाँ और अपवाद संरचित वस्तुओं रहे हैं कर सकते हैं। कंसोल पर मुद्रित त्रुटि संदेश वास्तव में एक स्वरूपित संदेश है जिसमें त्रुटि/अपवाद ऑब्जेक्ट के कई तत्वों की जानकारी है। आप (फिर से) यह अपने आप को इस तरह का निर्माण कर सकते हैं:

$formatstring = "{0} : {1}`n{2}`n" + 
       " + CategoryInfo   : {3}`n" + 
       " + FullyQualifiedErrorId : {4}`n" 
$fields = $_.InvocationInfo.MyCommand.Name, 
      $_.ErrorDetails.Message, 
      $_.InvocationInfo.PositionMessage, 
      $_.CategoryInfo.ToString(), 
      $_.FullyQualifiedErrorId 

$formatstring -f $fields 

तुम सिर्फ चाहते हैं त्रुटि संदेश अपने catch ब्लॉक में दिखाया गया है तो आप बस मौजूदा वस्तु चर (जो उस समय त्रुटि रखती है) गूंज कर सकते हैं:

try { 
    ... 
} catch { 
    $_ 
} 

यदि आपने ऊपर बताए एक स्वरूपित स्ट्रिंग के साथ रंग का उत्पादन उपयोग Write-Host की जरूरत है:

try { 
    ... 
} catch { 
    ... 
    Write-Host -Foreground Red -Background Black ($formatstring -f $fields) 
} 
इसी के साथ

कहा, आमतौर पर आप डॉन एक अपवाद हैंडलर में त्रुटि संदेश को बस प्रदर्शित करना नहीं चाहता (अन्यथा -ErrorAction Stop व्यर्थ होगा)। संरचित त्रुटि/अपवाद वस्तुएं आपको अतिरिक्त जानकारी प्रदान करती हैं जिनका उपयोग आप बेहतर त्रुटि नियंत्रण के लिए कर सकते हैं। उदाहरण के लिए आपके पास वास्तविक त्रुटि संख्या के साथ $_.Exception.HResult है। $_.ScriptStackTrace और $_.Exception.StackTrace, इसलिए आप डीबगिंग करते समय स्टैकट्रैस प्रदर्शित कर सकते हैं। $_.Exception.InnerException आपको नेस्टेड अपवादों तक पहुंच प्रदान करता है जिसमें अक्सर त्रुटि के बारे में अतिरिक्त जानकारी होती है (शीर्ष स्तर पावरशेल त्रुटियां कुछ सामान्य हो सकती हैं)। आप कुछ इस तरह के साथ इन नेस्ट अपवाद उतारना कर सकते हैं:

$e = $_.Exception 
$msg = $e.Message 
while ($e.InnerException) { 
    $e = $e.InnerException 
    $msg += "`n" + $e.Message 
} 
$msg 

आपके मामले में जानकारी आप निकालना चाहते हैं $_.ErrorDetails.Message में हो रहा है।यह मेरे लिए काफी स्पष्ट है अगर आप एक वस्तु या वहाँ JSON स्ट्रिंग नहीं है, लेकिन आप तो $_.ErrorDetails.Message एक वस्तु है आप

$_.ErrorDetails | Get-Member 
$_.ErrorDetails | Format-List * 

चलाकर प्रकार और $_.ErrorDetails के सदस्यों के मूल्यों के बारे में जानकारी प्राप्त करने के लिए सक्षम होना चाहिए

$_.ErrorDetails.Message.message 

अन्यथा आप पहली बार किसी ऑब्जेक्ट को JSON स्ट्रिंग बदलने की आवश्यकता: इस तरह संदेश स्ट्रिंग प्राप्त करने के लिए सक्षम होना चाहिए

$_.ErrorDetails.Message | ConvertFrom-Json | Select-Object -Expand message 

आप किस प्रकार की त्रुटि को संभालने में निर्भर हैं, विशेष प्रकार के अपवादों में समस्या के बारे में अधिक विशिष्ट जानकारी भी शामिल हो सकती है।

PS C:\>$e.Exception | Get-Member 

    TypeName: System.Net.WebException 

Name    MemberType Definition 
----    ---------- ---------- 
Equals   Method  bool Equals(System.Object obj), bool _Exception.E... 
GetBaseException Method  System.Exception GetBaseException(), System.Excep... 
GetHashCode  Method  int GetHashCode(), int _Exception.GetHashCode() 
GetObjectData Method  void GetObjectData(System.Runtime.Serialization.S... 
GetType   Method  type GetType(), type _Exception.GetType() 
ToString   Method  string ToString(), string _Exception.ToString() 
Data    Property System.Collections.IDictionary Data {get;} 
HelpLink   Property string HelpLink {get;set;} 
HResult   Property int HResult {get;} 
InnerException Property System.Exception InnerException {get;} 
Message   Property string Message {get;} 
Response Property System.Net.WebResponse Response {get;} 
Source   Property string Source {get;set;} 
StackTrace  Property string StackTrace {get;} 
Status   Property System.Net.WebExceptionStatus Status {get;} 
TargetSite  Property System.Reflection.MethodBase TargetSite {get;}

जो आप इस तरह की जानकारी के साथ प्रदान करता है::

PS C:\>$e.Exception.Response 

IsMutuallyAuthenticated : False 
Cookies     : {} 
Headers     : {Keep-Alive, Connection, Content-Length, Content-T...} 
SupportsHeaders   : True 
ContentLength   : 198 
ContentEncoding   : 
ContentType    : text/html; charset=iso-8859-1 
CharacterSet   : iso-8859-1 
Server     : Apache/2.4.10 
LastModified   : 17.07.2016 14:39:29 
StatusCode    : NotFound 
StatusDescription  : Not Found 
ProtocolVersion   : 1.1 
ResponseUri    : http://www.example.com/ 
Method     : POST 
IsFromCache    : False

के बाद से उदाहरण के लिए आपके मामले में आप एक WebException जो त्रुटि संदेश के अलावा ($_.Exception.Message) सर्वर से वास्तविक प्रतिक्रिया शामिल है नहीं सभी अपवादों संपत्तियों की ठीक उसी सेट है आप विशेष अपवाद के लिए विशिष्ट संचालकों का उपयोग करना चाहते हो सकता है:

try { 
    ... 
} catch [System.ArgumentException] { 
    # handle argument exceptions 
} catch [System.Net.WebException] { 
    # handle web exceptions 
} catch { 
    # handle all other exceptions 
} 

आप आपरेशन के दौरान एक त्रुटि आई है या नहीं (एक सॉकेट या एक डेटाबेस कनेक्शन को बंद करने की तरह सफाई कार्य) की परवाह किए बिना किया जा करने की जरूरत है कि है, तो आप अपवाद हैंडलिंग के बाद एक finally ब्लॉक में डाल कर सकते हैं:

try { 
    ... 
} catch { 
    ... 
} finally { 
    # cleanup operations go here 
} 
+0

मैं पहले से ही जवाब मिला है लेकिन यह बहुत अधिक विस्तृत है। चीयर्स। – JustAGuy

+0

पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। बहुत उपयोगी। –

6

मुझे मिल गया है!

अंतिम त्रुटि संदेश के लिए बस $Error[0] प्रिंट करें।

3

आप

-ErrorVariable errvar 

जोड़ने और फिर में देखने PowerShell में $ errvar

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