Continua il nostro approfondimento sulle strategie di error handling in PowerShell; oggetto di questo approfondimento è il blocco try-catch, presente in qualunque linguaggio di programmazione moderno.
Fonte: Powershell troubleshooting guide
di Michael Shepard
ISBN 978-1-78217-357-1
In questo modo l'esecuzione del blocco try viene interrotta a seguito di una Exception e viene dirottata l'esecuzione al blocco catch relativo al tipo di Exception da gestire.
Try, Catch, Finally
La release 2.0 di PowerShell ha introdotto il blocco try-catch, andando incontro alle richieste degli utilizzatori che chiedevano istruzioni quanto più simili ai linguaggi di programmazione moderni, sia application (C#, Java...) che web (Javascript, PHP...) che database (TSQL, PLSQL...)
Il funzionamento di un blocco try-catch è elementare:
- viene eseguito il codice all'interno del blocco try
- nel caso in cui venga rilevata una Exception viene eseguito il codice all'interno del blocco catch che gestisce quel tipo di Exception o nel blocco catch di default
- al termine dell'esecuzione del blocco try o del blocco catch, viene eseguito il blocco finally.
Analogamente al blocco trap, trattato nel precedente articolo [link], nel blocco catch, per accedere alla eccezione, è necessario utilizzare la variabile interna $_.
try{
$var = 1/0
write-output "ok"
}
catch{
write-warning "error: $_"
}
finally{
write-output "finish!"
}
Gestire più Exception
Un blocco try può generare al suo interno svariati tipologie di Exception, gestite tutte dal blocco catch. Ma se si vuole gestire in maniera particolare una Exception è possibile definire un blocco catch specifico per quel tipo. Vediamo un esempio:
try{
[...]
}
catch [System.IO.FileNotFoundException]{
write-warning "file not found exception"
}
catch{
write-warning "generic exception"
}
In questo modo l'esecuzione del blocco try viene interrotta a seguito di una Exception e viene dirottata l'esecuzione al blocco catch relativo al tipo di Exception da gestire.
Un try dentro l'altro (nested try-catch)
Un blocco try a sua volta può contenere un blocco try-catch-finally all'infinito, permettendo di gestire frammenti di codice in maniera specifica ogni volta.
try{
try{
#unsafe code here
}
catch{
#catch
}
#do something else that may be unsafe
try{
#other unsafe code
}
catch{
#catch
}
}
catch{
#catch
}
finally{
#at the end
}
catch
Chiaramente l'innesto di un try-catch dentro un try a lungo andare può ridurre la leggibilità del codice, è in questi casi che è meglio optare per trasferire il codice in una funzione dedicata e chiamare la funzione all'interno del blocco try:
function firstFunction{
try{
#do something
secondFunction()
}
catch{
write-warning "error $_"
}
}
function secondFunction{
try{
#do something
}
catch{
write-warning "error $_"
}
finally{
#do something
}
}
Conclusione
PRO | CONTRO |
---|---|
Utilizzo identico agli altri lignuaggi di programmazione moderni e rende il codice più leggibile.
|
Un blocco try-catch è più lungo da scrivere rispetto un blocco trap.
|
Nessun commento:
Posta un commento