prøv / Catch block i Po .ershell er at håndtere de fejl, der produceres i scriptet. For at være specifik skal fejlene afslutte fejl. Den endelig blok i Po .ershell er ikke obligatorisk at skrive hver gang sammen med Try/Catch, men den udføres uanset fejlen opstår eller ej.
så når du bruger prøveblokken, er Fangstblokken obligatorisk, men ikke endelig blok.
-
prøv / Fangstblok med Afslutningsfejl − nedenfor er eksemplet på Afslutningsfejl uden endelig blokering.,
Eksempel
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Lyd
I ovenstående eksempel, vi har noget tilbage, som ikke er tilladt, men den næste linje var ægte, selv om det ikke kunne udføre på grund af det afsluttende fejl.
vores mål er at fange undtagelsen og fejlmeddelelsen genereret i prøveblokken. Som vi ved, gemmes fejlen i $ Error-variablen. Hvis du kontrollerer output fra $ error-variablen, kan du få hele visningen, men når du kører et script, og du håndterer fejlene, skal du sørge for at rydde de gamle fejl ved hjælp af $error.,Ryd () kommando eller brug den nye PO .ershell-konsol. Hvis du kender den specifikke Fejlvariabel placering i et array, kan du direkte bruge det. For eksempel $error
Vi kan se, hvad der er alle egenskaber for $Error-variablen.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
Der er få egenskaber ovenfra, der er nyttige til at finde undtagelsen og fejloplysningerne. Lad os se dem, og vi kan også udnytte dem i Fangstblokken.
første InvocationInfo ejendom., Du kan også bruge $fejl, men dette er den eneste fejl, der er genereret indtil videre, så vi bruger direkte $fejl, men du kan ikke få autosuggestion Popup med $error variabel direkte.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
Du kan få de specifikke oplysninger fra linje og Positionbesked som vist nedenfor.
Kontroller nu Undtagelsesegenskaberne.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Undtagelse Besked
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Du kan bruge de andre egenskaber, som du mener vil være nyttig til at vise fejlmeddelelse. Vi vil bruge et par af disse i Fangstblokken til at fange fejlen., Da vi arbejder med den aktuelle fejl, vil vi bruge $_. at håndtere den aktuelle fejl / undtagelse.
Output
Error Message: The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
Som vi har set ovenfor var der ingen endelig blok, men prøv/Catch fortsatte med at arbejde. Du kan tilføje den endelig blok for at rydde dine variabler og fejl og vise enhver meddelelse.
-
prøv / Fangstblok med ikke-Afslutningsfejl.,
Som vi har set i det ovenstående eksempel, at Afslutning fejl kan kontrolleres med Try/Catch-blok, men Ikke-Terminering fejl, ikke fordi de er indbygget i cmdlet-kommandoer og-funktioner, der genereres fejl og standard præference for Fejl handling er Fortsat og dermed næste kommando fortsætte med at køre, selv om fejlen er ikke håndteres.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
for At tvinge Ikke-Terminering fejl til Afslutning fejl, er vi nødt til at ændre enten $ErrorActionPreference variabel til at Stoppe eller har brug for at bruge ErrorAction parameter med Stop-værdi., Her skal vi bruge parameteren ErrorAction, da vi har brug for den til en bestemt kommando og ikke for hele scriptet.
Eksempel
Lyd
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
Som du kan se i ovenstående eksempel, Get-Service giver den ikke-afslutning fejl, og vi kan konvertere det til at opsige fejl af –ErrorAction Stop parameter og det samme undtagelse er blevet fanget af Catch-Blok.
-
manuel håndtering af specifik undtagelse
Hvis du vil håndtere en bestemt type undtagelse, kan du angive undtagelsesnavnet i fangstblokken., For at kende navnet på undtagelsen skal du få ejendommen til $Error-variablen, og det er gettype(). I nedenstående eksempel skal vi finde undtagelsesnavnet fra fejludgangen nedenfor.
eksempel
Antag, at din fejl er gemt i $Error variabel, skal du køre under kommando for at få undtagelsesnavnet til at bruge i catch block.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
Du fik undtagelsestypenavnet med ovenstående kommando, du kan bruge det samme i fangstblokken, så fangstblokken kun fanger den specifikke undtagelse.,
Output
-
Fang flere undtagelser Po .ershell.
Du kan også fange de mange undtagelser i Po .ershell. Til det kan du bruge en enkelt prøveblok og flere fangstblokke.
eksempel
Output
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
Her, i den første kommando, selv Fejl genereret, så den næste kommando ikke udføres. Hvis den første kommando ikke genererer nogen fejl, vil den næste kommando blive kontrolleret, og hvis undtagelsen opstår, vil fangsten med den specifikke undtagelsesblok blive udført.,
Hvis du ikke ønsker at håndtere flere undtagelser, og du stadig har brug for nogle kommandoer fejl kan ignoreres, men bør ikke passere gennem catch-blok, så den næste kommando kunne udføre så kan du bruge Ignorere eller SilentlyIgnore i ErrorAction Parameter.