Try / Catch block in PowerShell is om de fouten te verwerken die in het script worden geproduceerd. Om specifiek te zijn, de fouten moeten worden beëindiging van fouten. Het laatste blok in de PowerShell is niet verplicht om elke keer samen met Try/Catch te schrijven, maar het zal worden uitgevoerd ongeacht de fout optreedt of niet.
dus als je het Try block gebruikt, is het Catch block verplicht, maar niet als laatste block.
-
Try / Catch block met Terminating error-Hieronder is het voorbeeld van Terminating error zonder finally block.,
voorbeeld
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
uitvoer
in het bovenstaande voorbeeld hebben we iets terug dat niet is toegestaan, maar de volgende regel was echt, hoewel het niet kon uitvoeren vanwege de afsluitfout.
ons doel is om de uitzondering en Foutmelding gegenereerd in de Try block te vangen. Zoals we weten, wordt de fout opgeslagen in de $ Error variabele. Als je de uitvoer van de $error variabele controleert kun je de volledige weergave krijgen, maar wanneer je een script uitvoert en je de fouten verwerkt, zorg er dan voor dat je de oude fouten verwijdert met $error.,clear () commando of gebruik de nieuwe PowerShell console. In het geval u weet dat de specifieke fout variabele locatie in een array kunt u direct gebruiken dat. Bijvoorbeeld, $error
We kunnen zien wat alle eigenschappen zijn van de $Error variabele.
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
Er zijn enkele eigenschappen van boven zijn nuttig om de uitzondering en fout details te vinden. Laat ze zien en we kunnen ze ook gebruiken in het Vangblok.
eerste Aanroepinfo eigenschap., U kunt ook $Error gebruiken, maar dit is de enige fout die tot nu toe is gegenereerd, dus we gebruiken direct $Error, maar u kunt de autosuggestion Popup met $error variabele niet direct krijgen.
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 :
u kunt de specifieke informatie krijgen van Line and PositionMessage zoals hieronder getoond.
Controleer nu de eigenschappen van uitzonderingen.
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.
Exception Message
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.
u kunt de andere eigenschappen gebruiken waarvan u denkt dat ze nuttig zijn om de foutmelding weer te geven. We gaan een paar van deze in de Catch block gebruiken om de fout te vangen., Als we werken met de huidige fout zullen we $_gebruiken. om te gaan met de huidige fout/uitzondering.
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:
zoals we hierboven hebben gezien was er geen definitief blok, maar Try/Catch bleef werken. U kunt het laatste blok toevoegen om uw variabelen en fouten te wissen en elk bericht weer te geven.
-
Try / Catch-blok met niet-Beëindigingsfout.,
zoals we in het bovenstaande voorbeeld hebben gezien, kunnen Beëindigingsfouten worden gecontroleerd met het try/Catch-blok, maar niet-Beëindigingsfouten niet omdat ze ingebouwde cmdlets zijn en functies gegenereerde fouten en de standaardvoorkeur voor de Foutactie is doorgaan en dus het volgende commando blijft uitvoeren, zelfs als de fout niet wordt afgehandeld.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
om de niet-eindigende fout te forceren naar de eindigende fout moeten we de variabele $ErrorActionPreference veranderen om te stoppen of de parameter ErrorAction met Stopwaarde gebruiken., Hier gaan we de ErrorAction Parameter gebruiken omdat we het nodig hebben voor een specifiek commando en niet voor het hele script.
voorbeeld
uitvoer
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
zoals u kunt zien in het bovenstaande voorbeeld, produceert Get-Service de niet-beëindigende fout en kunnen we deze converteren naar beëindigende fout door –ErrorAction Stop parameter en dezelfde uitzondering is gevangen door Catch Block.
-
handmatig omgaan met specifieke uitzondering
Als u een specifiek type uitzondering wilt verwerken, kunt u de naam van de uitzondering opgeven in het vangstblok., Om de naam van de uitzondering te weten moet je de eigenschap van de $Error variabele krijgen en het is GetType(). In het onderstaande voorbeeld moeten we de naam van de uitzondering vinden uit de onderstaande foutuitvoer.
voorbeeld
stel dat uw fout is opgeslagen in de variabele $Error, dan moet u het onderstaande commando uitvoeren om de naam van de uitzondering te gebruiken in het vangstblok.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
u hebt de naam van het type uitzondering met het bovenstaande commando, u kunt hetzelfde gebruiken in het catch block zodat het catch block alleen die specifieke uitzondering zal vangen.,
uitvoer
-
Catch Multiple Exception PowerShell.
u kunt ook de meerdere uitzonderingen in PowerShell vangen. Voor dat, kunt u gebruik maken van een enkele proberen blok en meerdere vangst blokken.
voorbeeld
uitvoer
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
Hier wordt in het eerste commando zelf een fout gegenereerd zodat het volgende commando niet wordt uitgevoerd. Als het eerste commando geen fout genereert dan zal het volgende commando worden gecontroleerd en als de uitzondering optreedt dan zal Catch met dat specifieke uitzonderingsblok worden uitgevoerd.,
als u niet meerdere uitzonderingen wilt afhandelen en toch een aantal commando ‘ s nodig hebt, kunnen fouten worden genegeerd, maar moeten niet door catch block gaan, zodat het volgende commando kan worden uitgevoerd, dan kunt u de Ignore of SilentlyIgnore gebruiken in de ErrorAction Parameter.