[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]
装置制御ライブラリには,PostScriptプログラムをデバッグするのに役立つエラー・ ハンドラが登録されています。エラー・ハンドラは出力の最後のページを印刷するとともに, エラーを特定するための情報も提供します。
エラー・ハンドラは通常のプリント・ジョブに自動的に組み込まれるわけではありません( システム管理者がこの省略時の設定を変更した場合を除きます) 。したがって,次の方法でエラー・ハンドラを明示的に起動しなければなりません。
$ PRINT/SETUP=LPS$ERRORHANDLER filename
エラー・ハンドラはPostScriptメッセージを返します。第18章に説明するように, /PARAMETERS=MESSAGES修飾子を使用すれば,これらのメッセージをファイルまたはプリンタに送信することができます。 次の例を参照してください。
$ PRINT/QUEUE=PS40$A10/PARAMETERS=MESSAGES=KEEP FILE.PS
PostScriptアプリケーションを開発する場合には,第14章の説明に従って, エラー・ハンドラ・セットアップ・モジュールを含むようにフォームを定義することにより, エラー・ハンドラをより簡単に起動することができます。
エラー・ハンドラはユーザ・プログラムで変更された可能性のある定義を使用するのではなく, ディクショナリ systemdict からオペレータを参照します。
場合によっては,エラー・ハンドラがロードされるときに,プログラムが異なる動作を実行する可能性があります。 たとえば,PostScriptサーバ・ ループ・コンテキストの外部で exit オペレータを実行すると, エラー・ハンドラがロードされていない場合には,invalidexit エラーが発生します。しかし,エラー・ハンドラがロードされている場合には, プログラムは正しく終了し,エラーは発生しません。
例 17-1に示すログ・ ファイルの例は, 次のPostScriptプログラムを対象にしています。
[/1st-level [/2nd-level [/3rd-level [/4th-level 56 ] ] ] (end)] /myproc { [ 8 8 ] 0 0 div setdash } def 100 200 moveto myproc
次のコマンドにはエラー・ハンドラが指定されており,ログ・ファイルが作成されます。
$ PRINT/PARAMETERS=MESSAGES=KEEP/SETUP=LPS$ERRORHANDLER filename
例 17-1では,プログラムを実行したときにログ・ ファイルに追加されるエラー・ハンドラからの出力を示しています。
ERROR: undefinedresult [1] OFFENDING COMMAND: div [2] OPERAND STACK: [3] 0 0 [ 8 8 ] [/1st-level [/2nd-level [/3rd-level -array- ] ] (end) ] EXECUTION STACK: [4] { setdash } GRAPHICS STATE: [5] Current Matrix: [ 4.16667 0.0 0.0 -4.16667 0.0 3298.0 ] Color: 0.0 Current position: x = 100.0, y = 200.0 Line width: 1.0 Line cap: 0 Line join: 0 Flatness: 1.0 Miter limit: 10.0 Dash pattern: [ ] 0.0
ここに示したサンプル・ファイルの先頭に定義されている配列には,最初の要素としてその配列自体を示すポインタが含まれています。 これは2レベルの深さに展開されます。 配列の最も内部のバージョンは単に-array- として表現されます。
エラーが発生した場合には,エラー・ハンドラは showpage コマンドを実行し,出力の最後のページを印刷します(例 17-1 を参照)。また,次の情報も出力します。
エラー・ハンドラはスタックに入っている各オブジェクトの値を表示します。 その場合,数値は10進数で表示します。配列のすべての要素, 文字列,およびプロシージャは再帰的に表示されます。他のオブジェクトは別の方法で記述されます。 たとえば,セーブ・オブジェクトの場合は-savelevel- が表示されます。
最初に表示される項目はスタックの先頭のオブジェクトです。
実行スタックには,実行中のプロシージャの一部が示されています。 先頭のオブジェクトは実行されつつあるオペレータとオペランドを含むプロシージャです。2 番目のオブジェクトは呼び出しプロシージャのまだ実行されていない部分です。
PostScriptコードでエラーを検出した場合には,ファイルを作成したアプリケーションを変更するか, またはアプリケーション・プログラマに問題を通知しなければなりません。
PostScriptデータは,通常はPostScriptソース・ファイルに記述されたとおりに表現されますが, エラー・ハンドラがPostScriptデータを特別に表現することもあります。
配列には実行可能配列と実行不可能配列があります。実行可能配列は中括弧({ }) で囲んで表示されるプロシージャであり,実行不可能配列は大括弧([ ]) で囲んだ複数のオブジェクトとして表示されます。配列を読み込むことができない場合や, 深さが3レベルを超える場合には,配列は次のいずれかの方法で表現されます。
PostScript言語は,エラー・ハンドラでは認識できない新しいデータ・フォーマットを含むように拡張できます。 認識できないフォーマットのデータは2 つの引用符と認識できないデータ・フォーマットの名前として表現されます。
PostScriptストリームのどこでエラーが発生したかを正確に判断することは困難であり, 不可能な場合もあります。これは,実行スタックがコンテキストを一意的に識別できない可能性があるからです。 この場合には,診断情報をPostScript ファイルに追加することができます。たとえば,エラーが showpage 定義に関連しているように思われる場合には,次に示すようにPostScript コードを変更します。
/myshowpage { (At the top of my showpage\n) print flush % some PostScript code (Just before real showpage call\n) print flush showpage } def