Buscar..


Sintaxis

  • { -code- } se detuvo { -error- } { -no-error- } ifelse% error atrapando marco

  • $ error / errorname get% stackunderflow typecheck rangecheck etc
    $ error / newerror obtener% bool. poner falso para desactivar el error
    $ error / ostack obtiene% copia de la pila de operandos en el punto de error

  • errordict / stackoverflow { -additional-code- / stackoverflow signalerror} poner
    % ejecuta código adicional en tipos de errores (aquí, el error / stackoverflow).

Observaciones

Hay dos niveles para el manejo de errores en postscript. Esta dicotomía se aplica tanto a la forma en que el intérprete maneja los errores como a los medios disponibles para que el usuario (programador) controle el manejo.

El nivel inferior es una estructura de control inusual que se stop ... stopped . stopped comporta de manera muy similar a una construcción de bucle, ya que establece una marca en la pila de ejecución que se puede saltar si se llama al operador de exit (para un bucle) o al operador de stop (para un -contexto stopped ). A diferencia de una construcción en bucle, stopped produce un valor booleano en la pila que indica si se llamó a la stop (de lo contrario, se sabe que el procedimiento pasado a stopped se ha ejecutado hasta su finalización).

Cuando se produce un error de PostScript, como puede ser el stackunderflow , el intérprete busca el nombre del error en errordict que vive en systemdict . Si el usuario no ha reemplazado el procedimiento en errordict , entonces el procedimiento de error predeterminado tomará instantáneas de toda la pila y las colocará en $error , otro diccionario en systemdict . Finalmente, el procedimiento por defecto llamará a stop que saca el programa del usuario de la pila de exec y ejecuta el procedimiento de impresión de error del intérprete llamado handleerror en errordict .

Entonces, al utilizar todo este conocimiento, puede detectar errores si ajusta una sección de código en { ... } stopped . Puede volver a emitir un error llamando a stop . Puede determinar qué tipo de error ocurrió con $error /errorname get .

También puede cambiar el comportamiento predeterminado para un tipo específico de error al reemplazar el procedimiento con ese nombre en errordict . O cambie el formato de impresión del informe de errores reemplazando /handleerror en errordict .

¿Hay un punto de corriente?

Rendimiento true en la pila si currentpoint ejecuta con éxito, o false si señala un error de /nocurrentpoint .

{currentpoint pop pop} stopped not  % bool

Secuencia de eventos cuando se señala un error.

La secuencia de un error suele ser:

  1. el error se activa al buscar el nombre del error en errordict y ejecutar este procedimiento.
  2. errordict procedimiento errordict llama a signalerror , pasándole el nombre de error.
  3. signalerror toma instantáneas de las pilas, guardando las instantáneas en $error , y luego las llamadas se stop .
  4. stop hace estallar la pila exec hasta que el operador detenido detiene el contexto de cierre más cercano.
  5. si el programa no ha establecido su propio contexto detenido para detectar el error, será capturado por un nivel externo stopped { errordict /handleerror get exec } if el código de inicio lo llamó para poner en paréntesis a todo el programa del usuario.
  6. handleerror utiliza la información en $error para imprimir un informe de error.

Señalizando (tirando) un error

La mayoría de las herramientas están estandarizadas con la excepción del nombre del operador para lanzar un error. En los intérpretes de Adobe, se llama .error . En ghostscript, se llama signalerror . Así que con esta línea puede usar signalerror en el código postscript para intérpretes de Adobe o ghostscript o xpost.

/.error where {pop /signalerror /.error load def} if

nombre de comando errorname signalerror -
Tome instantáneas de la pila en $error , luego stop .

P.ej.

% my proc only accepts integer
/proc {
    dup type /integertype ne {
        /proc cvx /typecheck signalerror
    } if
    % ... rest of proc ...
} def

Atrapando un error

Dado que la acción final del controlador de errores predeterminado es llamar a la stop , puede detectar errores de los operadores al incluir el código en una construcción { ... } stopped .

{
    0 array
    1 get
} stopped {
    $error /errorname get =
} if

imprimirá " rangecheck ", el error señalado por get cuando el índice está fuera del rango aceptable para esa matriz.

Errores de relanzamiento

Este fragmento implementa un procedimiento que se comporta como un operador de bucle postscript. Si el usuario proc llama a exit , detecta el error invalidexit para arreglar la pila de discos para el end al final. Cualquier otro error, excepto invalidexit se relanza llamando a stop .

% array n proc  .  -
% Like `forall` but delivers length=n subsequences produced by getinterval
/fortuple { 4 dict begin
    0 {offset proc n arr} {exch def} forall
    /arr load length n idiv
    {
        {
            /arr load offset n getinterval
            [ /proc load currentdict end /begin cvx ] cvx exec
            /offset offset n add def
        } stopped {
            $error /errorname get /invalidexit eq
            { 1 dict begin exit }{ stop } ifelse
        } if
    } repeat
end
} def

%[ 0 1 10 {} for ] 3 {} fortuple pstack clear ()=


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow