AutoLISP 関数が原因で発生したエラーによってプログラムが予期せず終了することがあるため、エラーが発生する既知のすべての状況を確実に処理する必要があります。
以下は、catch-me-if-you-can という名前の関数を定義します。この関数は、2 つの数値の引数を受け取り、vl-catch-all‑apply を使用して最初の数値を 2 番目の数値で除算します。vl‑catch‑all‑error‑p 関数は、vl‑catch‑all‑apply からの戻り値がエラー オブジェクトかどうかを調べます。戻り値がエラー オブジェクトの場合は、catch-me-if-you-can は vl‑catch‑all‑error‑message を呼び出してエラー オブジェクトからメッセージを取得します。
(defun catch-me-if-you-can (dividend divisor / errobj) (setq errobj (vl-catch-all-apply '/ (list dividend divisor))) (if (vl-catch-all-error-p errobj) (progn (print (strcat "An error occurred: " (vl-catch-all-error-message errobj))) (initget "Yes No") (setq ans (getkword "Do you want to continue? [Y/N]: ")) (if (equal (strcase ans) "YES") (print "Okay, I'll keep going") ) ) (print errobj) ) (princ) )
(catch-me-if-you-can 50 2)
関数は 25 を返します。
(catch-me-if-you-can 50 0)
関数は、次のプロンプトを表示します。
"エラーが発生しました: 0 (ゼロ)で除算しました" 続けますか?[はい(Y)/いいえ(N)]:
y と入力すると、catch-me-if-you-can は処理の続行を示します。vl-catch-all-apply を apply に変更して、この例を変更してみてください。 再度 0(ゼロ)で除算する例をロードして実行します。apply ではエラーが発生すると、実行がただちに停止され、*error* が呼び出され、エラー メッセージが表示されます。
vl-catch-* 関数は、AutoLISP で ActiveX を使用するときに特に重要になります。多くの AutoCAD ActiveX オートメーションのメソッドは、「例外によるプログラミング」形式で使用されるよう設計されています。つまり、正常に終了すると有効な値が返され、失敗すると例外が発生します(エラー値は返されません)。プログラムが ActiveX メソッドを使用している場合は、例外を検出するためにプログラムを準備する必要があります。そうしておかないとコマンド プロンプトを表示したままプログラムが停止してしまいます。