En fejl i en PowerShell script, der vil forhindre det i at gennemføre med succes. Brug af fejlhåndtering med try catch blocks giver mulighed for at styre og reagere på disse afslutningsfejl. I dette indlæg vil jeg dække det grundlæggende i try / catch blocks og hvordan man finder og håndterer specifikke undtagelsesmeddelelser.

forståelse af syntaksen

try catch block syntaksen er meget enkel., Den består af to sektioner indkapslet i krøllede parenteser med den første identificeret som prøveblokken og den anden som fangstblokken.

try { # Statement to try}catch { # What to do with terminating errors}

prøveblokken kan have så mange udsagn i den, som jeg vil; jeg vil dog anbefale at holde det til så få som muligt, sandsynligvis kun en enkelt erklæring. Pointen med fejlhåndtering er at arbejde med en erklæring ad gangen og håndtere alt, hvad der sker med det.

Her er et eksempel på en fejl, der opstår i Po .ershell-konsollen., Her er jeg opretter en ny fil ved hjælp af den Nye-Post-cmdlet og angivelse af en ikke-eksisterende mappe for at se Stien:

Hvis det var i et script, udsender dette til skærmen ville spilde plads, og problemet kan ikke umiddelbart synlige. Ved hjælp af en prøve fangstblok kan jeg begynde at manipulere fejludgangen og gøre den mere admin venlig.

Her er vores samme nye element kommando i en prøve fangst blok. Bemærk, at jeg på linje 2 var nødt til at tilføje parameteren ErrorAction med en værdi af Stop til kommandoen., Ikke alle fejl betragtes som “afslutning”, så nogle gange er jeg nødt til at tilføje denne bit kode for korrekt at afslutte i fangstblokken.

Nu, i stedet for en blok af røde vred-se teksten, jeg har en simpel advarsel, at det løb ind i et problem. Det ikke-eksisterende stinavn sammen med forcing-ErrorAction Stop dråber logikken ind i fangstblokken og viser min brugerdefinerede advarsel.

brug af $Error-variablen

mens det er mere læsbart, er dette ikke særlig nyttigt., Alt, hvad jeg ved, er, at kommandoen ikke afsluttede med succes, men jeg ved ikke hvorfor. I stedet for at vise min brugerdefinerede besked, Kan jeg vise den specifikke fejlmeddelelse, der opstod i stedet for hele den røde tekst undtagelse blok. Når der opstår en fejl i prøveblokken, gemmes den i variablen $Error. $Error-variablen indeholder en række nylige fejl, og jeg kan henvise til den seneste fejl i arrayet på indeks 0.,

advarsel produktion er nu mere beskrivende viser, at kommandoen mislykket, fordi den ikke kunne finde en del af vejen. Denne meddelelse var en del af vores oprindelige fejlmeddelelse, men er nu mere kortfattet.

brug af Undtagelsesmeddelelser

Jeg kan også bruge flere fangstblokke, hvis jeg vil håndtere specifikke fejl forskelligt. Her vil jeg vise to forskellige brugerdefinerede meddelelser, en for hvis stien ikke findes, og en for hvis et ulovligt tegn bruges i navnet., Bemærk, at jeg i det følgende skærmbillede kørte scriptet to gange med to forskellige kommandoer i prøveblokken. Hver kommando, fangst blok, og endelige output er angivet med de orange og grønne pile.

Kigger på linjer 14-16, der er en tredje catch-blok uden en undtagelse besked. Dette er en “catch-all” fangst blok, der vil køre, hvis fejlen ikke svarer til nogen anden fangst blok undtagelse., Hvis jeg kører dette script og ser meddelelsen i den sidste fangstblok, ved jeg, at fejlen ikke er relateret til et ulovligt tegn i filnavnet eller en del af stien, der ikke er gyldig.

hvordan vidste jeg nu undtagelsesmeddelelserne, der skulle bruges i de to første fangstblokke? Dette kan findes ved at se på de forskellige oplysninger, der er knyttet til $Error-variablen. Efter en mislykket kommando opstår, kan jeg køre $fejl.Undtagelse.GetType ().FullName for at se undtagelsesmeddelelsen for den sidste fejl, der opstod.,når jeg går tilbage til Po .ershell-konsollen, genskaber jeg kommandoen ne.-Item med en ikke-eksisterende sti, og løb derefter min $Error-kommando for at finde undtagelsesmeddelelsen.

Den røde tekst, der kommer umiddelbart efter det mislykkede kommando også indeholder den undtagelse besked, men indeholder ikke som modul er det fra. Når man ser på $Error-variablen, vises den fulde meddelelse, der skal bruges til en fangstblok.,

brug af try / catch blocks giver ekstra strøm til håndtering af fejl i et script og tager forskellige handlinger baseret på fejlen. Fangsten blok kan vise mere end blot en fejlmeddelelse. Det kan indeholde logik, der løser fejlen og fortsætter med at udføre resten af scriptet.