Respuesta

10

Como está utilizando las constantes, el intérprete intenta precalcular el resultado y falla con una división por error cero. Tu código ni siquiera se ejecuta, por lo que no hay nada que atrapar.

Puede verificar esto usted mismo cambiando su código para usar variables, forzándolo a ser ejecutado.

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

De Windows PowerShell en acción (p.257)

Este ejemplo utiliza 1/$ nula. La razón para hacer esto en lugar de simplemente 1/0 es porque el intérprete de PowerShell hace algo llamado plegado de expresión constante.

Examina las expresiones que solo contienen valores constantes. Cuando ve uno, evalúa esa expresión una vez en tiempo de compilación para que no tenga que perder tiempo haciéndolo de nuevo en tiempo de ejecución.

Esto significa que las expresiones imposibles, como la división por cero, son detectadas y tratadas como errores de análisis. Los errores de análisis no se pueden detectar y no se registran cuando se ingresan de manera interactiva, por lo que no se toman como como un buen ejemplo. (Si un script llama a otro guión y el guión tiene uno de estos errores, la secuencia de comandos de llamada puede cogerlo, pero el guión que se está analizando no puede.)

1

Usted puede tratar de lanzar una excepción con ese tipo de línea: trap { "Your Exception" } 1/0
Esto lanzará la excepción "división por 0". Aunque realmente no entiendo por qué tu código no lanza una excepción ._.
PS: ¿No se supone que es catch [System.SystemException]? :)

4

RuntimeException en v2 no son capturable. Se ha corregido en v3.

La división por cero cae en esta categoría.

+0

+1 - ¿Tiene una referencia para esto? –

+1

Entonces ... mi mal. :) No fue RuntimeException. Acabo de copiar sobre FullyQualifiedErrorId, y eso no contiene detalles importantes para ese escenario. En cuanto a v3: no puedo encontrar ninguna referencia (todavía). Doug Finke mencionó este cálculo como ejemplo en su próximo libro, "PowerShell para desarrolladores", así que probé y me di cuenta de que en v3 realmente * puede * ser capturado. Perdón por cualquier confusión causada por el uso de terminología incorrecta ... :) – BartekB

+0

Thx para la actualización. Si encuentra una referencia, espero que todavía la publique aquí. –

Cuestiones relacionadas