vl-catch-all-apply を使用してエラーを検出するには(AutoLISP)

AutoLISP 関数が原因で発生したエラーによってプログラムが予期せず終了することがあるため、エラーが発生する既知のすべての状況を確実に処理する必要があります。

  1. エラーをスローできる各関数を、vl-catch-all-apply を使用してラップします。
  2. vl-catch-all-apply が返す値を vl-catch-all-error-p を使用して評価し、エラー オブジェクトまたはエラー値が返されたかどうかを確認します。
  3. 返されたエラー オブジェクトに関連付けられたメッセージを取得するには、vl-catch-all-error-message を使用します。
  4. コードをロードし、実行し、テストします。

以下は、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 を呼び出してエラー オブジェクトからメッセージを取得します。

  1. AutoCAD のコマンド プロンプトに対して、次のコードを入力します。
    (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)
    )
    注: 既存のファイルにサンプル コードを追加したり、新しい LSP ファイルを作成することもできます。次に、APPLOAD[アプリケーション ロード]コマンドを使用して LSP ファイルをロードします。
  2. 次のコードを入力します。
    (catch-me-if-you-can 50 2)

    関数は 25 を返します。

  3. 次のコードを入力します。
    (catch-me-if-you-can 50 0)

    関数は、次のプロンプトを表示します。

    "エラーが発生しました: 0 (ゼロ)で除算しました" 続けますか?[はい(Y)/いいえ(N)]:

    y と入力すると、catch-me-if-you-can は処理の続行を示します。vl-catch-all-applyapply に変更して、この例を変更してみてください。 再度 0(ゼロ)で除算する例をロードして実行します。apply ではエラーが発生すると、実行がただちに停止され、*error* が呼び出され、エラー メッセージが表示されます。

    vl-catch-* 関数は、AutoLISP で ActiveX を使用するときに特に重要になります。多くの AutoCAD ActiveX オートメーションのメソッドは、「例外によるプログラミング」形式で使用されるよう設計されています。つまり、正常に終了すると有効な値が返され、失敗すると例外が発生します(エラー値は返されません)。プログラムが ActiveX メソッドを使用している場合は、例外を検出するためにプログラムを準備する必要があります。そうしておかないとコマンド プロンプトを表示したままプログラムが停止してしまいます。

    注: ActiveX 関数は Windows でのみ使用可能です。