W tym great article Keith wyjaśnia różnicę między błędami kończącymi i nie kończącymi się w Powershell. Według Keitha wyjątki generowane z wywołań do elementu obiektu .NET lub typu są nie kończącymi się błędami.Czy wyjątek od metody .net jest kończący się lub nie kończący się błąd?
Rzeczywiście jeśli definiujemy tej klasy .net do testowania:
$a = Add-Type 'public class bla { public static void bl() { throw new System.ApplicationException("test"); }}' -PassThru
I wówczas funkcję:
function tst { 1 | write-host; $a::bl(); 2 | Write-host }
widzimy, że gdy TST funkcja nazywana jest wyjątek wydaje się być nie- kończenie: działa drugi Write-Host
.
Ale pomyśl o tym:
function tst2 { try { tst } catch { "Catch!" } }
Jeśli otworzymy the documentation, możemy przeczytać, że połów reaguje na błędy lub uchwyty kończące w skryptach. W całym tekście artykułów błędy, z którymi ma do czynienia artykuł, zostały zakwalifikowane jako "kończące się" w wielu miejscach.
Kiedy więc uruchomimy linię powyżej drugiego Write-Hosta NIE działa, ale blok catch ma. Wygląda na to, że nasz nie kończący się błąd nagle kończy się.
Jak to możliwe?
Kolejna obserwacja, że ze starej dobrej pułapkę to jeszcze nie kończące błąd:
function tst3 { tst trap { "Trap!" } }
Teraz, z praktycznego punktu widzenia, co chcę osiągnąć jest następujące. W bloku kodu chcę zakończyć na wyjątkach wyrzuconych z kodu .NET. Chcę pozostawić kończące się błędy z kończenia cmdletów i nie kończące się błędy z cmdletów nie kończących się.
Jak to osiągnąć?
Przykład:
Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()
Chcę rozwiązać wszystkich wyjątków od .net zwraca powyżej. Też chcę zakończyć na kończących się błędach z cmdletów. Nie chcę kończyć się na błędach nie kończących się z cmdletów.
@keithhill możesz pomóc? Dzięki! –
Czy nie można tego zdefiniować za pomocą $ ErrorActionPreference? Nie tyle, co rzeczywiste zachowanie kodu, ale jak skrypt go obsługuje ...? –