lunedì 19 marzo 2018

POWERSHELL - ERROR HANDLING - TRY CATCH

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

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:
  1. viene eseguito il codice all'interno del blocco try
  2. 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
  3. 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

PROCONTRO
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