自作エラー処理は、関数を定義しているの中でも定義できます。
エラーメッセージを変えるだけ。など、シンプルなエラー処理を設定したい場合などは、別にエラー処理関数を作るより簡単に設定できます。
予備知識
関数の中でエラー処理関数を設定
エラー設定は、defunでコマンド/関数のプログラムの中でも定義することができます。
まずはプログラム例から
(defun c:test ( / *error* Obj)
;-----------------------------------------
(defun *error* (msg)
(princ msg)
(princ))
;-----------------------------------------
(while T ; ここから
(setq Obj (car (entsel))) ; 図形選択
(command-s "._CHANGE" Obj "" "_P" "_C" "1" "") ;Objの図形を赤にする。
) ;while ここまで繰り返す
(princ));defun
これは、entsel で選択した図形の色を赤色に変えるコマンドです。
(while T ……. ) で繰り返すように設定しているので、このコマンドを終えるときはESCキーでキャンセルするときだけ。
このコマンドを実行してキャンセルすると、
; エラー: 関数がキャンセルされました
毎回エラーと表示されます。
それについて、詳しくはコチラの記事を。
やはり、エラーという文字を見るのは気持ちのよいものではないし、AutoLISPをよく知らずに使っている方とシェアした時、何かトラブルでも?!と思われる可能性があります。
そこで、このコマンドは、実行時に自作エラー処理が設定されるように、
;—————————————–
(defun *error* (msg)
(princ msg)
(princ))
;—————————————–
が入っています。
(defun *error*…… で、エラー処理を上書きしています。
msg には、AutoCADから渡されたエラーメッセージが入り、処理は princでメッセージを表示するだけなので、
関数がキャンセルされました
だけが表示されます。
(princ msg) の部分を無くして何も表示しない。ようにしてもいいし、msgの代わりに
(princ “コマンドキャンセル”)など、他の文言を入れてもいいです。
ただ、エラー処理が実行されるときは、引数としてエラーメッセージが渡されるので、(defun *error* (msg)
この部分には、メッセージを使っても使わなくても、必ず引数(エラーメッセージ)を入れる変数名を入れてください。
msg でも、a でも、変数名として使える英数字なら何でもいいです。
ローカル関数としてコマンド内にとどめる
(defun c:test ( / *error* Obj)
プログラムの1行目、コマンド/関数名の横の( ) で、/ の次に来る変数はローカル変数でしたね。
標準のエラー処理を、(defun *error* で上書きしてしまっていますが、これもローカル関数として、このプログラム外には影響しないようにできます。
コマンド内だけで有効なローカル関数になっているので、エラー処理を元々の設定に戻す必要はなく、コマンドが終了(中断)すれば、(defun *error*…. で上書き設定した部分は消えて最初の設定に戻ります。
試してみよう
同じコマンドで、エラー処理を入れたバージョンと入れていない物を用意したので、ESCでキャンセルして、エラーメッセージがコマンドラインにどう出るか比べてみてください。
エラー処理あり
(defun c:test1 ( / *error* Obj)
;-----------------------------------------
(defun *error* (msg)
(princ msg)
(princ))
;-----------------------------------------
(while T ; ここから
(setq Obj (car (entsel))) ; 図形選択
(command-s "._CHANGE" Obj "" "_P" "_C" "1" "") ;Objの図形を赤にする。
) ;while ここまで繰り返す
(princ));defun
エラー処理無し
(defun c:test2 ( / Obj)
(while T ; ここから
(setq Obj (car (entsel))) ; 図形選択
(command-s "._CHANGE" Obj "" "_P" "_C" "1" "") ;Objの図形を赤にする。
) ;while ここまで繰り返す
(princ));defun
エラーメッセージ
今回のエラー処理した場合としてない場合の違いは、中断したときの処理にコマンドラインに表示される文字が、
関数がキャンセルされました
; エラー: 関数がキャンセルされました
これだけの違いです。
しかし、エラーの文字が気になる人多いので、自作エラー処理はあった方が無難です。
もちろん、システム変数を戻すなどの処理も、同じ方法で入れることもできます。
システム変数を戻す処理を加えた例はコチラの記事で。
関連記事
まとめ
- 自作エラー処理関数は、自作コマンド/関数のプログラム内でも定義できる。
- (defun *error* と、標準エラー処理の*error*を上書きしても、(/ *error*) でローカル関数にすればコマンド終了(中断)後は元に戻る。
Comments