サーチ…
構文
{ -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 ()=