Jagaimo
システム変数を変更しても、エラー/キャンセル時には元の値に戻す
エラー処理の解答編です。
解答
エラー処理をコマンド定義内でする場合
(defun c:test ( / *error* Old_Os)
(setq Old_Os (getvar "OSMODE"))
;===========================================
(defun *error* (msg)
(setvar "OSMODE" Old_Os)
(princ))
;===========================================
(setvar "OSMODE" 0)
(command-s "._MOVE" pause "" "0,0" "150,50")
(setvar "OSMODE" Old_Os)
(princ))
defun *error* (msg) (setvar “OSMODE” Old_Os) (princ)) で、エラー処理 *error* を上書きします。内容は、「OSMODEを変数Ols_Osの値に戻す。」だけです。
一行目の ( / *error* Old_Os) で、ローカル関数にしているので、コマンド終了後は元のエラー設定に戻ります。
エラー処理を別けて自作関数にする場合
(defun c:test ( / Old_Error Old_Os)
(Test-Start) ;エラー処理
(setvar "OSMODE" 0)
(command-s "._MOVE" pause "" "0,0" "150,50")
(Test-End) ;エラー処理
(princ))
;=====================================
;エラー処理用の関数定義
(defun Test-Start ()
(setq Old_Error *error*) ;標準エラー処理を保存
(setq *error* Test-Error) ;エラー処理をTest-Errorにする
(setq Old_Os (getvar "OSMODE")) ;OSMODEの値を保存
)
;---------------------------------
(defun Test-End ()
(setvar "OSMODE" Old_Os) ;OSMODEの値を戻す
(setq *error* Old_Error) ;エラー処理を戻す
)
;---------------------------------
(defun Test-Error (msg)
(Test-End) ;Test-Endを実行
(princ msg) ;エラーメッセージ表示
(princ "err")
(princ))
;=====================================
OSMODEの値とエラー処理をを保存し、新しいエラー処理に変更する自作関数 Test-Start
OSMODE の値とエラー処理を元の値に戻す自作関数 Test-End
途中でエラー中断を起こした場合、Test-End を実行してエラーメッセージ表示をするTest-Error
という関数を作成しました。そして、コマンド定義では、最初にTest-Startを実行、最後のTest-Endを実行にしています。
別の自作関数に分ける利点は、同じエラー処理を別のコマンドでも使い回せることです。
エラー処理の自作関数があれば、例えば今回の場合だと、最初に (Test-Start)、最後に (Test-End) を入れるだけです。
関連記事
今回は、練習問題だったのでシステム変数はOSMODEしか変更しませんでしたが、CMDECHO DYNMODEも変更すると使い勝手が良くなります。
エラー処理についての記事一覧
コマンド実行
(command-s “._MOVE” pause “” “0,0” “150,50”) は、コマンドMOVE[移動]実行しています。
コマンド実行について詳しくはこちらの記事で。
Comments