een van de belangrijkste onderdelen van een goed PowerShell script is error handling. Zelfs in het kortste script, in staat zijn om fouten te verwerken helpt om ervoor te zorgen dat een onverwachte gebeurtenis niet zal gaan om het systeem dat u werkt op wrak. Neem het voorbeeld hieronder. Elke week in onze steekproef bedrijf (MyCompany.Com) Human Resources gaan een lijst uploaden die ons vertelt wie toegang moet hebben tot de Onkostendatabase., Als een naam niet in de lijst van HR staat, gaan we hem uit de groep verwijderen en die gebruiker zal niet langer in staat zijn om onkostendeclaraties te loggen:
nu kunt u zien waar dit fout gaat. Een week HR niet rond om het uploaden van de lijst of, net als we op het punt om toegang te krijgen tot de lijst, de file server sterft. Plotseling PowerShell gooit een fout op de Get-Content cmdlet en de $AuthorizedUser variabele blijft leeg. Omdat ons script geen fouten verwerkt, blijft het draaien en, in een zeer korte tijd, heeft het elke gebruiker uit onze uitgavengroep verwijderd., Al snel stromen de woedende telefoontjes binnen en wordt het leven een beetje minder gelukkig. De manier om dit alles te voorkomen is om de fouten te vangen en vervolgens omgaan met de gebeurtenis die hen heeft veroorzaakt (die in dit geval is stoppen met het script en hebben een schreeuw naar iemand in HR).
Terminating and Non-Terminating Errors
een van de belangrijkste dingen om te weten wanneer het vangen van fouten is dat alleen bepaalde fouten standaard kunnen worden gevangen. Fouten komen in twee soorten-terminating en niet-terminating. Een beëindigingsfout is een fout die een functie of operatie zal stoppen., Als u een syntaxisfout maakt of geen geheugen meer hebt, is dat een beëindigingsfout. Afsluitfouten kunnen worden opgevangen en behandeld. Niet-beëindigende fouten staan Powershell toe om door te gaan en komen meestal uit cmdlets of andere beheerde situaties. Onder normale omstandigheden kunnen ze niet worden gevangen door Try-Catch-Finally. De Get-Content fout in het bovenstaande voorbeeld is een niet-beëindigende fout.
niet-beëindigende fouten behandelen als beëindigende
dus hoe vang je een niet-beëindigende fout op? Kortom, je vertelt PowerShell om het te behandelen als terminating. Om dit te doen gebruik je de ErrorAction parameter., Elke PowerShell cmdlet ondersteunt fouten. Door het opgeven van-ErrorAction Stop aan het einde van een cmdlet zorgt u ervoor dat eventuele fouten die het gooit worden behandeld als terminating en kunnen worden gevangen. In ons voorbeeld hierboven gaan we onze Get-Content regel veranderen in:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
alle fouten behandelen als beëindigen
Het is ook mogelijk om alle fouten te behandelen als beëindigen met behulp van de erroractionpreference variabele. Je kunt dit doen voor het script waarmee je werkt of voor de hele PowerShell sessie. Om het in een script in te stellen, maak je de eerste regel $ErrorActionPreference = Stop., Om het in te stellen voor de sessie, typ $ErrorActionPreference = Stop bij de PowerShell console.
vangen van een Afsluitfout
Als u er zeker van bent dat de fout die u probeert te vangen wordt behandeld als afsluitend, kunt u een Try Catch block bouwen rond het commando (of commando ‘ s) dat de fout kan veroorzaken. De eerste fase is om het gedeelte van uw script dat de fout kan gooien met een Try block omringen. In ons voorbeeld wordt de Get-Content regel:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
onmiddellijk na het Try block moet u een Catch block plaatsen om de fout te verwerken., Het Catch-blok wordt alleen geopend als er een afsluitfout optreedt, anders wordt het genegeerd. In ons voorbeeld gaan we een admin e-mailen om te zeggen dat er een fout is opgetreden en dan stoppen we het script. Onze Get-Content regel is nu:
toegang tot het Foutrecord
zodra u zich in een vangstblok bevindt, kunt u toegang krijgen tot het foutrecord, dat is opgeslagen in de huidige objectvariabele $_. Foutrecords hebben verschillende nuttige eigenschappen, maar de belangrijkste die u wilt openen is $_.Uitzondering., Uitzonderingen zijn waar we hier echt mee te maken hebben als we fouten vangen en behandelen – uitzonderingen zijn de onverwachte gebeurtenis die de fout veroorzaakte (de foutrecord zelf is eigenlijk alleen echt een wrapper voor het presenteren van de uitzondering aan de PowerShell-gebruiker). Het is de uitzondering die we vangen en de uitzondering die alle echt nuttige informatie over het probleem bevat. Als er een ander onderliggend probleem was dat onze uitzondering veroorzaakte, wordt het ook geregistreerd op $_.uitzondering.innerexception (en ga zo maar door-de volgende onderliggende uitzondering wordt opgeslagen op$_.uitzondering.innerexceptie.,innerexception etc.). Voor de doeleinden van ons voorbeeld gaan we $_gebruiken.Uitzondering om wat extra informatie in onze kennisgeving e-mail te zetten, met behulp van de $_.Uitzondering.Bericht en $_.Uitzondering.ItemName properties:
specifieke uitzonderingen vangen
nu, zoals ons voorbeeld staat, vangen we alle fouten op die optreden tijdens het lezen van het bestand en behandelen ze allemaal op dezelfde manier. Je kunt echter specifieke uitzonderingen vangen en er anders mee omgaan, maar – en het is een grote maar-alleen als de oorspronkelijke fout wordt beëindigd., Omdat de Get-Content cmdlet niet-beëindigende fouten gooit (die we alleen hebben behandeld als beëindigen met behulp van ErrorAction) kunnen we niet specifiek de verschillende uitzonderingen vangen die de cmdlet zou kunnen gooien. Dit is een functie van PowerShell en is van toepassing op elke niet-beëindigende fout, ongeacht de ErrorActionPreference en kan niet worden gewijzigd. Toch kunnen we omgaan met andere beëindigende uitzonderingen, zoals een fout in het geheugen, die tijdens de leesbewerking zou kunnen opduiken. Voor dit voorbeeld is dat wat we zullen doen.,
u vangt specifieke afsluitfouten door de naam van de uitzondering onmiddellijk na het trefwoord Catch op te geven. In ons voorbeeld willen we een systeem vangen.OutOfMemory uitzondering en, als we er een krijgen, zal de no nonsense aanpak van het opnieuw opstarten van de computer onmiddellijk te nemen. We zullen ook een algemeen catch-blok toevoegen na ons bestand not found-blok om alle andere uitzonderingen te vangen:
tot slot, gebruikmakend van Finally
Het Laatste deel van Try Catch tot slot is het Finally block. Dit moet onmiddellijk na het Vangblok worden gedefinieerd en elke keer worden uitgevoerd, ongeacht of er een fout was of niet., Op deze manier kunt u acties uitvoeren die moeten worden gemaakt, ongeacht of een operatie slaagt of mislukt. In ons voorbeeld gaan we loggen dat een gelezen bestand werd geprobeerd. Onze Get-Content regel ziet er nu uit als: