Sponsored links

【AutoLISP ドリル】エラー対策/処理 2 解答編

Sponsored links
professional crop black technician working with hardware ドリル
Photo by Field Engineer on Pexels.com
Sponsored links
Jagaimo
Jagaimo

システム変数を変更しても、エラー/キャンセル時には元の値に戻す

エラー処理の解答編です。

Sponsored links

解答

エラー処理をコマンド定義内でする場合

(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