Spiegare Try / Catch / Finally block in PowerShell

Try/Catch block in PowerShell è quello di gestire gli errori che vengono prodotti nello script. Per essere specifici, gli errori dovrebbero terminare gli errori. Il blocco Finally in PowerShell non è obbligatorio per scrivere ogni volta insieme a Try/Catch ma verrà eseguito indipendentemente dal verificarsi o meno dell’errore.

Quindi, quando si utilizza il blocco Try, il blocco Catch è obbligatorio ma non definitivamente bloccato.

  • Try / Catch block with Terminating error − Di seguito è riportato l’esempio di Terminazione dell’errore senza finally block.,

Esempio

try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}

Output

Nell’esempio precedente, abbiamo restituito qualcosa che non è consentito ma la riga successiva era autentica sebbene non potesse essere eseguita a causa dell’errore di terminazione.

Il nostro obiettivo è catturare l’eccezione e il messaggio di errore generato nel blocco Try. Come sappiamo, l’errore è memorizzato nella variabile Error Error. Se controlli l’output della variabile error error puoi ottenere l’intera vista, ma ogni volta che esegui uno script e stai gestendo gli errori assicurati di cancellare i vecchi errori usando error error.,comando clear () o utilizzare la nuova console PowerShell. Nel caso in cui si conosca la posizione specifica della variabile di errore in un array, è possibile utilizzarla direttamente. Ad esempio, error error

Possiamo vedere quali sono tutte le proprietà della variabile Error Error.

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

Ci sono poche proprietà dall’alto sono utili per trovare i dettagli dell’eccezione e dell’errore. Lasciateli vedere e possiamo sfruttarli anche nel blocco Catch.

Prima proprietà InvocationInfo., Puoi anche usare Error Error ma questo è l’unico errore generato finora, quindi stiamo usando direttamente Error Error ma non puoi ottenere direttamente il popup di autosuggestione con la variabile error error.

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 :

È possibile ottenere le informazioni specifiche da Line e PositionMessage come mostrato di seguito.

Controlla ora le proprietà delle eccezioni.

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.

Messaggio di eccezione

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.

Puoi usare le altre proprietà che ritieni utili per visualizzare il messaggio di errore. Useremo alcuni di questi nel blocco Catch per rilevare l’errore., Mentre stiamo lavorando con l’errore corrente useremo $_. per gestire l’errore/eccezione corrente.

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:

Come abbiamo visto sopra non c’era nessun blocco finale ma Try / Catch ha continuato a funzionare. È possibile aggiungere il blocco Finally per cancellare le variabili e gli errori e visualizzare qualsiasi messaggio.

  • Prova / Cattura blocco con errore non terminante.,

Come abbiamo visto nell’esempio precedente, gli errori di terminazione possono essere controllati con il blocco Try / Catch ma gli errori non terminanti non possono perché sono cmdlet incorporati e funzioni generate errori e la preferenza predefinita per l’azione di errore è Continua e quindi il comando successivo continua a funzionare anche se l’errore non viene gestito.

PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue

Per forzare l’errore di non terminazione all’errore di terminazione, è necessario modificare la variabile Er ErrorActionPreference in Stop o utilizzare il parametro ErrorAction con il valore di Stop., Qui, useremo il parametro ErrorAction come ne abbiamo bisogno per un comando specifico e non per l’intero script.

Esempio

Output

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

Come puoi vedere nell’esempio precedente, Get-Service produce l’errore di non terminazione e possiamo convertirlo in terminazione error by-ErrorAction Parametro Stop e la stessa eccezione è stata catturata dal blocco Catch.

  • Gestire manualmente un’eccezione specifica

Se si desidera gestire un tipo specifico di eccezione, è possibile fornire il nome dell’eccezione nel blocco catch., Per conoscere il nome dell’eccezione è necessario ottenere la proprietà della variabile Error Error ed è GetType(). Nell’esempio seguente, dobbiamo trovare il nome dell’eccezione dall’output dell’errore sottostante.

Esempio

Supponiamo che il tuo errore sia memorizzato nella variabile Error Error, devi eseguire sotto il comando per ottenere il nome dell’eccezione da utilizzare nel blocco catch.

$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException

Hai il nome del tipo di eccezione con il comando precedente, puoi usare lo stesso nel blocco catch in modo che il blocco catch catturi solo quell’eccezione specifica.,

Uscita

  • Cattura più eccezioni PowerShell.

È anche possibile catturare le eccezioni multiple in PowerShell. Per questo, è possibile utilizzare un singolo blocco Try e più blocchi catch.

Esempio

Output

Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value

Qui, nel primo comando, si genera un errore in modo che il comando successivo non venga eseguito. Se il primo comando non genera alcun errore, il comando successivo verrà controllato e se si verifica l’eccezione verrà eseguito il Catch con quel blocco di eccezioni specifico.,

Se non si desidera gestire più eccezioni e comunque è necessario per alcuni comandi gli errori possono essere ignorati ma non devono passare attraverso il blocco catch in modo che il comando successivo possa essere eseguito, è possibile utilizzare Ignora o SilentlyIgnore nel parametro ErrorAction.

Pubblicato il 06-Giu-2020 16:36:12

Pubblicità

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Vai alla barra degli strumenti