PostScript内部错误处理程序过程的说明

时间:2015-06-09 10:13:37

标签: postscript

我不知道这个问题的标题应该是......

我正在为翻译工作,目前我正在研究错误处理。我已经看到有一个$ error和errordict字典存储在systemdict中。

PLRM包含可能发生错误的信息以及处理错误的几个步骤。但是,当我在ghostscript中执行此命令时:

errordict /stackoverflow get ==

我收到此信息:

  

{/ stackoverflow {1 - .instopped-- {null --eq-- { - pop-- --pop--   --stop--} --if--} --if--(I)false - .setdebug-- $ error /.inerror --get-- 1 - .instopped-- { - pop-- } {--pop-- true} --ifelse-- {。undestoppederrorhandler} --if-- $ error / globalmode - .currentglobal--   false - .setglobal---put-- $ error /.inerror true --put-- $ error   / newerror true --put-- $ error --exch-- / errorname --exch-- --put--   $ error --exch-- / command --exch---put-- $ error / errorinfo --known--   --not-- {$ error / errorinfo null --put--} --if-- $ error / recordstacks --get-- $ error / errorname --get-- / VMerror --ne---and - {--count-- --array-- --astore-- --dup-- $ error / ostack 4 -1 --roll-- --countexecstack---array-- --execstack-- --dup---length-- 2 --sub-- 0 --exch---getinterval-- $ error / estack 3 -1 --roll-- --countdictstack-- --array-- - -dictstack-- $ error / dstack 3 -1 --roll-- --put-- --put-- --put-- --aload - --pop--} {$ error / dstack - 。 undef-- $ error / estack - .undef-- $ error / ostack - .undef--} - ifelse-- $ error / position --currentfile---status-- {--currentfile-- { --fileposition--} .internalstopped {--pop-- null}   --if--} {$ error / command --get-- --dup-- --type-- / filetype --eq-- {{--fileposition--} .internalstopped {--pop-- null } --if--} { - pop--   null} --ifelse--} --ifelse-- --put-- $ error / globalmode --get-- $ error   /.nosetlocal --get-- --and-- - .setglobal-- $ error /.inerror false   --put-- --stop--} --exec - }

这似乎是一个压缩的阵列:

errordict /stackoverflow get type pstack

结果:

  

packedarraytype

现在我在哪里可以找到这种信息(哪个手册?)?这些程序在哪里描述,以便我可以实施它们。

这不仅仅是错误,而且其他运算符似乎也有一个压缩阵列(过程)作为值,但我无法在PLRM中找到此过程的实现。

1 个答案:

答案 0 :(得分:3)

一旦你收到 Inside Postscript 这本书,这将变得更加清晰,但我可以总结一下。

很难从上面的转储中看到,但如果你以同样的方式转储几个错误处理程序,很明显中间的大程序主体对于所有处理程序都是相同的,并且所有处理程序都遵循相同的将错误名称传递给此过程的模式(timeout错误有一个例外)。而你实际上是这样实现的:

errordict /stackunderflow {
    /stackunderflow //signalerror exec
} put

signalerror实现公共代码的位置。对于timeout错误(如果您选择实现该错误),没有命令放置在堆栈上,因此其errordict过程略有不同。

errordict /timeout {
    /timeout /timeout //signalerror exec
} bind put

signalerror(或.error是本书中描述的名称)获取所有堆栈的快照并将其保存在$error字典中。

因此错误的顺序通常是:

    通过在errordict中查找错误名称并执行此过程来触发
  1. 错误。
  2. errordict过程调用signalerror,并将错误名称传递给它。
  3. signalerror获取堆栈的快照,将快照保存在$error中,然后调用stop
  4. stop弹出exec堆栈,直到stopped运算符建立的最近的已停止上下文为止。
  5. 如果程序没有建立自己的已停止的上下文来捕获错误,它将被一个外层stopped { handleerror } if捕获,它由启动代码调用以包含整个用户程序。
  6. handleerror使用$error中的信息打印错误报告。
  7. 顺便说一下,您可以将packedarray实现为只读数组。在内存受限的打印机的最早实现中需要它们,但我发现设置更紧凑的对象表示太复杂了。从行为上看,与常规数组的唯一区别是打包数组必须只读