त्रुटियाँ और अपवाद संरचित वस्तुओं रहे हैं कर सकते हैं। कंसोल पर मुद्रित त्रुटि संदेश वास्तव में एक स्वरूपित संदेश है जिसमें त्रुटि/अपवाद ऑब्जेक्ट के कई तत्वों की जानकारी है। आप (फिर से) यह अपने आप को इस तरह का निर्माण कर सकते हैं:
$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
}
मैं पहले से ही जवाब मिला है लेकिन यह बहुत अधिक विस्तृत है। चीयर्स। – JustAGuy
पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। बहुत उपयोगी। –