AutoLISPが
– エラーで中断したとき、
– ユーザーがESCキーを押してキャンセルしたとき、
エラー処理関数が実行されます。
ここでは、標準のエラー処理の働きを紹介します。
*error*とは
ユーザ定義可能なエラー処理関数です。
AutoCAD 2020 ヘルプ
エラー処理関数とは、
- AutoLISPプログラムに問題があって中断した時
- ユーザーがコマンドをESCキーを押してキャンセルした時
に実行されるプログラムです。
他の関数と大きく違ってユーザーが変更ができます!!
と書こうと、一応試してみたら (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 / エラーの文字を目にするのは気分が良いものではありませんね。
作った本人なら、; エラーと出てきても、
エラー処理関数の中の (princ “; エラー: “) が正しく動作したな。
と思えますが、AutoLISPを同僚にシェアする時、error / エラーの文字が出ると嫌がられます。
このAutoLISP、何か悪さをしてるんじゃないの?
それとも私、AutoLISPを壊した?
と不安がられることもありますので、誰かにシェアするときは特に、エラーメッセージの表示に工夫を加えることをおススメします。
私も実際に、「AutoLISPを使うとエラーが頻繁に出る。」と言われたことがあります。ということで、私は、エラーメッセージは
(princ (strcat “\nxxErr or User Cancel \n” msg))
文字列の中の/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