Odpowiedz

10

Podczas korzystania ze stałych, interpreter próbuje wstępnie obliczać wynik i kończy się niepowodzeniem z błędem dzielenia przez zero. Twój kod nie zostanie nawet wykonany, więc nie ma nic do pułapki.

Możesz to sprawdzić samodzielnie, zmieniając kod, tak aby używał zmiennych, zmuszając go do wykonania.

try { 
    $divisor = 0 
    [int]$a = 1/$divisor 
} 
catch { 
    write 1 
} 
finally { 
    write 2 
} 

Od Windows PowerShell w działaniu (p.257)

Przykładem tutaj wykorzystuje 1/$ null. Powodem, dla którego zamiast tego jest po prostu 1/0, jest to, że interpreter PowerShell wykonuje coś, co nazywa się ciągłym wyrażaniem składni .

Przegląda wyrażeń zawierających tylko wartości stałe. Gdy widzi go jeden raz, ocenia to wyrażenie raz podczas kompilacji, więc nie musi tracić czasu na robienie tego ponownie w czasie wykonywania.

Oznacza to, że niemożliwe wyrażenia, takie jak dzielenie przez zero, są przechwycone i traktowane jako błędy parsowania. Błędy analizowania nie mogą zostać przechwycone i nie są rejestrowane, gdy są wprowadzane interaktywnie, więc nie stanowią one dobrego przykładu. (Jeśli jeden skrypt wywołuje inny skrypt i że skrypt ma jeden z tych błędów, skrypt wywołujący może go złapać, ale skrypt nie może być analizowany.)

1

Można spróbować rzucić wyjątek z tego rodzaju linia: trap { "Your Exception" } 1/0
Ten rzuci wyjątek „dziel przez 0”. Chociaż tak naprawdę nie rozumiem, dlaczego twój kod nie rzuca wyjątku ._.
PS: Czy to nie powinno być catch [System.SystemException]? :)

4

RuntimeException w v2 nie są połów. Zostało to naprawione w wersji 3.

Dzielenie przez zero należy do tej kategorii.

+0

+1 - Czy masz do tego odnośnik? –

+1

Więc ... moje złe. :) To nie był RuntimeException. Właśnie skopiowałem FullyQualifiedErrorId, i to nie zawiera szczegółów ważnych dla tego scenariusza. Dotyczy v3: Nie mogę znaleźć żadnego odnośnika (jeszcze). Doug Finke wspomniał o tym wyliczeniu jako przykładzie w swojej nadchodzącej książce "PowerShell dla programistów", więc spróbowałem i zdałem sobie sprawę, że w wersji v3 faktycznie * można * złapać. Przepraszamy za jakiekolwiek zamieszanie spowodowane użyciem niewłaściwej terminologii ... :) – BartekB

+0

Thx za aktualizację. Jeśli znajdziesz odniesienie, mam nadzieję, że nadal byś to opublikował. –

Powiązane problemy