5

На моем компьютере каждый из следующих фрагментов кода выбрасывает и исключает вместо печати на стандартный вывод «1» и «2» Почему исключение не попадает?PowerShell - Почему «Divide By Zero Exception» не пойман?

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

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

ответ

10

Как вы используете константы, интерпретатор пытается прекомпотировать результат и с ошибкой деления на нуль. Ваш код даже не выполняется, поэтому нечего ловить.

Вы можете проверить это сами, изменив код, чтобы использовать переменные, заставляя его выполнять.

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

С Windows PowerShell в действии (с.257)

пример здесь использует 1/$ Null. Причиной для этого вместо просто 1/0 является то, что интерпретатор PowerShell делает что-то называемое сгибание постоянного выражения.

Он просматривает выражения, содержащие только постоянные значения. Когда он видит один, он оценивает это выражение один раз во время компиляции, поэтому не должен тратить время на повторное выполнение во время выполнения.

Это означает, что невозможные выражения, такие как деление на ноль, равны , пойманным и обрабатываемым как ошибки синтаксического анализа. Ошибки анализа не могут быть пойманы и не регистрируются, когда они введены в интерактивном режиме, поэтому они не делают для хорошего примера. (Если один сценарий вызывает другой сценарий, и что скрипт имеет одну из этих ошибок, сценарий вызова может поймать его, но сценарий может быть разобран нет.)

1

Вы можете попытаться бросить исключение с такой линии: trap { "Your Exception" } 1/0
Это отбросит исключение «деление на 0». Хотя я действительно не понимаю, почему ваш код не генерирует исключение ._.
PS: Разве это не должно быть catch [System.SystemException]? :)

4

RuntimeException в v2 не catchable. Это было исправлено в v3.

Деление на ноль попадает в эту категорию.

+0

+1 - У вас есть ссылка на это? –

+1

Итак ... мой плохой. :) Это не RuntimeException. Я просто скопировал FullyQualifiedErrorId, и это не содержит подробностей, важных для этого сценария. Что касается v3: я не могу найти ссылку (пока). Дуг Финке упомянул этот расчет в качестве примера в своей новой книге «PowerShell for Developers», поэтому я попытался и понял, что в v3 он действительно может быть схвачен. Извините за любую путаницу, вызванную неправильной терминологией ... :) – BartekB

+0

Thx для обновления. Если вы найдете ссылку, я надеюсь, вы все равно опубликуете ее здесь. –

Смежные вопросы