サーチ…
構文
{ -code- } stopped { -error- } { -no- error- } ifelse%エラー捕捉フレーム
$ error / errorname get stackoverflow typecheck rangecheckなどを取得する
$ error / newerrorは%boolを取得します。エラーを無効にするにはfalseを入れる
$ error / ostackエラーの時点でオペランドスタックの%コピーを取得するerrordict / stackoverflow { -additional- code- / stackoverflow signalerror} put
%エラーの種類(ここでは、/ stackoverflowエラー)で追加のコードを実行します。
備考
ポストスクリプトではエラー処理に2つのレベルがあります。この二分法は、インタプリタがエラーを処理する方法と、ユーザ(プログラマ)が処理を制御するために利用できる手段の両方に適用されます。
下のレベルは異常な制御構造のstop ... stopped
。 stopped
させることができる実行スタック上のマークを、ループのexit
オペレータまたはstop
れたコンテキストのためのstopped
オペレータが呼び出された場合に設定するという点で、ループ構造とよく似た動作をします。ループ構造とは異なり、 stopped
ているかどうかを示すスタック利回りブールをstop
そうでない場合に渡す手順(呼ばれたstopped
完了するまで実行されたことが知られています。
stackunderflow
ようにPostScriptエラーが発生すると、インタプリタはsystemdict
にあるerrordict
エラーの名前をerrordict
ます。ユーザーがerrordict
のプロシージャーを置き換えなかった場合、デフォルトのエラープロシージャーはすべてのスタックのスナップショットをとり、 systemdict
別の辞書である$error
置きます。最後に、デフォルトの手順が呼び出されますstop
execのスタックからユーザプログラムをポップと呼ばれるインタプリタのエラー印刷手順実行handleerror
でerrordict
。
したがって、この知識をすべて使用すると、 { ... } stopped
でコードの一部を折り返してエラーを捕らえることができます。 stop
を呼び出すと、エラーを再現できます。 $error /errorname get
発生したエラーの種類を特定することができ$error /errorname get
。
errordict
その名前でプロシージャーを置き換えることで、特定のタイプのエラーのデフォルトの動作を変更することもできます。 /handleerror
を置き換えて、エラーレポートの出力形式を変更してerrordict
。
カレントポイントはありますか?
収量true
スタック上の場合currentpoint
正常に実行される、またはfalse
それはIF信号/nocurrentpoint
エラーを。
{currentpoint pop pop} stopped not % bool
エラーが通知されたときのイベントのシーケンス
通常、エラーのシーケンスは次のとおりです。
-
errordict
エラー名をerrordict
、このプロシージャを実行するとエラーが発生します。 -
errordict
プロシージャはsignalerror
を呼び出し、エラー名を渡します。 -
signalerror
はスタックのスナップショットをとり、スナップショットを$error
保存してからstop
を呼び出しstop
。 -
stop
は、停止した演算子によって確立された最も近い囲まれた停止コンテキストまでexecスタックをポップします。 - プログラムがエラーを捕捉するために独自の停止コンテキストを確立していない場合は、起動コードによって呼び出された外部レベルの
stopped { errordict /handleerror get exec } if
によって捕捉され、ユーザープログラム全体をstopped { errordict /handleerror get exec } if
。 -
handleerror
は$error
の情報を使用してエラーレポートを出力します。
エラーのシグナリング(スロー)
ほとんどのツールは、エラーを投げる演算子の名前を除いて標準化されています。 Adobeのインタプリタでは、それは.error
と呼ばれ.error
。ゴーストスクリプトでは、それはsignalerror
と呼ばれsignalerror
。したがって、この行では、Adobeのインタプリタやghostscriptまたはxpostのpostscriptコードでsignalerror
を使用することができます。
/.error where {pop /signalerror /.error load def} if
コマンド名の ERRORNAMEの signalerror -
スタックのスナップショットを$error
で取得し、 stop
ます。
例えば。
% my proc only accepts integer
/proc {
dup type /integertype ne {
/proc cvx /typecheck signalerror
} if
% ... rest of proc ...
} def
エラーをキャッチする
デフォルトのエラーハンドラの最終的な動作はstop
を呼び出すstop
ので、コードを{ ... } stopped
構造体で囲むことでオペレータからのエラーをキャッチできます。
{
0 array
1 get
} stopped {
$error /errorname get =
} if
" rangecheck
"が表示され、インデックスがその配列の許容範囲外のときにget
によって通知されるエラーが発生します。
再スローエラー
このスニペットは、ポストスクリプトのループ演算子のように動作するプロシージャを実装します。ユーザーの場合はproc
呼び出してexit
、それがキャッチinvalidexit
ためdictstack修正するエラーをend
終わり。 invalidexit
以外のエラーは、 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 ()=