我不知道这个问题的标题应该是......
我正在为翻译工作,目前我正在研究错误处理。我已经看到有一个$ 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中找到此过程的实现。
答案 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
中查找错误名称并执行此过程来触发errordict
过程调用signalerror
,并将错误名称传递给它。 signalerror
获取堆栈的快照,将快照保存在$error
中,然后调用stop
。stop
弹出exec堆栈,直到stopped
运算符建立的最近的已停止上下文为止。stopped { handleerror } if
捕获,它由启动代码调用以包含整个用户程序。handleerror
使用$error
中的信息打印错误报告。顺便说一下,您可以将packedarray
实现为只读数组。在内存受限的打印机的最早实现中需要它们,但我发现设置更紧凑的对象表示太复杂了。从行为上看,与常规数组的唯一区别是打包数组必须只读。