In questo great article Keith spiega la differenza tra gli errori di terminazione e quelli non terminanti in PowerShell. Secondo Keith, le eccezioni generate dalle chiamate a un membro di un oggetto o tipo .NET sono errori non terminanti.È un'eccezione da un metodo .net un errore di terminazione o di non terminazione?
Infatti se definiamo questa classe .net per il test:
$a = Add-Type 'public class bla { public static void bl() { throw new System.ApplicationException("test"); }}' -PassThru
E poi questa funzione:
function tst { 1 | write-host; $a::bl(); 2 | Write-host }
vedremo che quando viene chiamata la funzione TST l'eccezione sembra essere non terminazione: il secondo Write-Host
funziona.
Ma considera questo:
function tst2 { try { tst } catch { "Catch!" } }
Se apriamo the documentation, possiamo leggere che il fermo risponde o gestisce gli errori che terminano in script. In tutto il testo degli articoli gli errori trattati dall'articolo sono qualificati come "terminanti" in numerosi luoghi.
Quindi quando eseguiamo la riga sopra il secondo Write-Host NON viene eseguito ma il blocco di cattura lo fa. Sembra che il nostro errore non terminante diventi improvvisamente terminante.
Come mai?
Un'altra osservazione, è che con la buona vecchia trappola è ancora non fatale errore:
function tst3 { tst trap { "Trap!" } }
Ora, dal punto di vista pratico, ciò che voglio ottenere è la seguente. In un blocco di codice voglio terminare le eccezioni generate dal codice .NET. Voglio lasciare gli errori di chiusura dai cmdlet che terminano e gli errori non terminanti dai cmdlet non terminanti.
Come ottengo questo?
Esempio:
Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()
voglio terminare su tutte le eccezioni da .net chiamate sopra. Voglio anche terminare la chiusura degli errori dai cmdlet. Non voglio terminare con errori non terminanti dai cmdlet.
@keithhill puoi aiutare? Grazie! –
Non è definibile da $ ErrorActionPreference? Non tanto quanto il vero comportamento di terminazione del codice, ma su come lo gestisce ...? –