Sponsored links

【AutoLISP エラー処理】 コマンド関数定義の中で自作エラー処理関数を定義

Sponsored links
AutoLISP
Sponsored links

自作エラー処理は、関数を定義しているの中でも定義できます。

エラーメッセージを変えるだけ。など、シンプルなエラー処理を設定したい場合などは、別にエラー処理関数を作るより簡単に設定できます。

Sponsored links

予備知識

関数の中でエラー処理関数を設定

エラー設定は、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