Sponsored links

【AutoLISP エラー処理】 エラー処理関数 の標準の働きは?

Sponsored links
AutoLISP
Sponsored links

AutoLISPが
– エラーで中断したとき、
– ユーザーがESCキーを押してキャンセルしたとき、
エラー処理関数が実行されます。

ここでは、標準のエラー処理の働きを紹介します。

Sponsored links

*error*とは

ユーザ定義可能なエラー処理関数です。

AutoCAD 2020 ヘルプ

エラー処理関数とは、

  • AutoLISPプログラムに問題があって中断した時
  • ユーザーがコマンドをESCキーを押してキャンセルした時

に実行されるプログラムです。

Jagaimo
Jagaimo

他の関数と大きく違ってユーザーが変更ができます!!
と書こうと、一応試してみたら (defun getpoint ()(getint))で、警告が出ることもなく、関数getpointの機能 がgetint に変わってしまいました。

既存のAutoLISP関数でも警告メッセージすら出ることなく上書きされてしまうので、自作関数を作るときには被らないように名前に気を付けましょう。

AutoLISP標準の*error* の働き

何もカスタマイズしていない、AutoLISP標準のエラー処理の働きは、こうなっています。AutoCADからのエラーメッセージをコマンドラインに表示させるという、シンプルなものです。

(defun *error* (msg)
  (princ "; エラー: ")
  (princ msg)
 (princ)
)

中身のAutoLISPの説明をすると

(defun *error* (msg)
エラーが起きて、エラー処理が実行されるときに、AutoCADからエラーメッセージが引数として渡されて変数msg に入ります。

(princ “; エラー: “) (princ msg)
関数princ はコマンドラインに引数の文字列を表示させる機能があります。
; エラー: と表示し、変数msg に入っているAutoCADからのエラーメッセージを表示します。

エラー処理について何もいじっていない場合、AutoLISPが中断されると、

; エラー:AutoCADからのエラーメッセージ

がコマンドラインに表示されます。

AutoCADからのエラーメッセージはどんなもの?

実際にエラーがあるAutoLISPを入力してみて、どんなエラーメッセージがでてくるのか見てみましょう。

上で話したように、エラー処理といってもprinc でメッセージ出すだけなので、臆することなく、ぜひ、実際にエラーを起こして、AutoLISPエラー処理関数がどう働くのか確認してみてください。

AutoLISPプログラムにミスがあって中断

関数 + は引数の数字を合算する機能があります。必要な引数タイプは数字です。
渡す引数が文字列だとエラーになります。
123は数字ですが、””が付いて”123″では文字列としてコンピューターは読むので、文字列“123”を+の引数として入れてエラーを起こしてみましょう。

(+ "123")
; error: bad argument type: numberp: "123"
; エラー: 引数のタイプが間違っていますnumberp: "123"

「引数のタイプが間違っていますnumberp: “123”」がAutoCADからのエラーメッセージ部分です。
: numberp: “123”は「数字が欲しかったとこに、”123″ が入ってるよ。と教えてくれています。

ちなみに、numberp は、引数が数字かどうかを確かめるAutoLISP関数です。(Number-Predicate)
多分、AutoCADの中身では、関数+ を実行するときに numberpで引数をチェックしていて、そこでエラーが出ると教えてくれる。ということなんだと思います。

ユーザーがコマンド途中でキャンセル

コマンドの途中でユーザーがESCキーを押してキャンセルする場合も、エラー処理関数が実行されます。

では、実際にESCキャンセルした場合のエラーメッセージも見てみましょう。
(getint) を実行して、何も入力せずにESCキーを押してキャンセルしてください。

(getint)
; error: Function cancelled
; エラー: 関数がキャンセルされました

とエラーメッセージが出てきます。

キャンセルとエラー

コマンドの途中でESCキーを押してキャンセル。
これはAutoCADを使っている誰もが頻繁に行うことだと思います。

ただ、キャンセルしただけでerror / エラーの文字を目にするのは気分が良いものではありませんね。

作った本人なら、; エラーと出てきても、

Jagaimo
Jagaimo

エラー処理関数の中の (princ “; エラー: “) が正しく動作したな。

と思えますが、AutoLISPを同僚にシェアする時、error / エラーの文字が出ると嫌がられます。

このAutoLISP、何か悪さをしてるんじゃないの?
それとも私、AutoLISPを壊した?

と不安がられることもありますので、誰かにシェアするときは特に、エラーメッセージの表示に工夫を加えることをおススメします。

私も実際に、「AutoLISPを使うとエラーが頻繁に出る。」と言われたことがあります。ということで、私は、エラーメッセージは
(princ (strcat “\nxxErr or User Cancel \n” msg))

Jagaimo
Jagaimo

文字列の中の/n は改行です。
xxErr はその時の自作エラー処理関数名です。

xxErr or User Cancel
関数がキャンセルされました

ユーザーキャンセルと明記して、元々Errorと書いていた所をErrにして、さらに改行してエラーの印象を低くしているつもりです。

これは個人の好みで、カスタマイズしたエラー処理が実行されたことを確認したいので、私は自作エラー処理関数の名前も表示するようにしています。が、

(princ msg) だけで、AutoCADからのエラーメッセージだけ表示にしてもいいです。

もう一工夫したい!と言う方は、
Ifを使って、AutoCADから渡されたエラーメッセージが ”関数がキャンセルされました”の時とそうでないときとで、表示する文字列を変えてもいいと思います。

例えば、こんな感じで。

(defun MyError (msg)
  (if (= msg "関数がキャンセルされました")
    (princ "ユーザー キャンセル")
    (princ (strcat "エラー: " msg))
  )
(princ))

まとめ

  • エラー処理関数 *error* は、AutoLISPが中断した時に実行される処理。
  • エラー処理関数 *error* は、ユーザー定義(カスタマイズ)可能。
  • 標準は、; エラー: と表示した後に、AutoCADからのエラーメッセージを表示する。
  • ESCキーを押してキャンセルする場合もエラー処理関数が実行される。
  • キャンセルしただけでエラーと表示されるのは気分が良くないし誤解も招くので、カスタマイズして表現を変えることをおススメ。

関連記事

if 条件式について

Comments