Forum:Lisp
Thema:aktueller *error* handler
Möchten Sie sich registrieren?
Wer darf antworten? Registrierte Benutzer können Beiträge verfassen.
Hinweise zur Registrierung Sie müssen registriert sein, um Beiträge oder Antworten auf Beiträge schreiben zu können.
Ihr Benutzername:
Ihr Kennwort:   Kennwort vergessen?
Anhang:    Datei(en) anhängen  <?>   Anhänge verwalten  <?>
Grafik für den Beitrag:                                                
                                                       
Ihre Antwort:

Fachbegriff
URL
Email
Fett
Kursiv
Durchgestr.
Liste
*
Bild
Zitat
Code

*HTML ist AUS
*UBB-Code ist AN
Smilies Legende
Netiquette

10 20 40

Optionen Smilies in diesem Beitrag deaktivieren.
Signatur anfügen: die Sie bei den Voreinstellungen angegeben haben.

Wenn Sie bereits registriert sind, aber Ihr Kennwort vergessen haben, klicken Sie bitte hier.

Bitte drücken Sie nicht mehrfach auf "Antwort speichern".

*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.

T H E M A     A N S E H E N
Temuedschin

Beiträge: 48 / 0

AutoCAD 2023 / Windows 11

Hallo zusammen,

Ich bin gerade dabei meine kleinen LSP´s auf den aktuellen Stand zu bringen.
In meinen LSP´s benutze ich einen uralt *error* handler. 

Im Netz (Forum hier, LeeMac, AfraLisp, http://advanced.autolisp.info/, ...) finde ich nur *error* handler, welche älter als 7-10 Jahre sind.
Hat sich bezüglich *error* handler in den letzten jahren so wenig getan, dass man auch die alten bedenkenlos einsetzen kann?

Suche nur einen einfachen *error* handler, welcher mir gesetzte variablen zurücksetzt und einen "undo" Befehl sauber ausführt.

mein *error* handler von http://advanced.autolisp.info/error2.html:

Code:
(defun startErrorHandler(name undoMode varsToSave /
                          ErrorTemplate saveList)
  (setq errorTemplate
  '( (msg / name undo savedVars previousHandler)
      ;... Zeile wird eventuell noch eingesetzt
      ;... Zeile wird noch eingesetzt
      ;... Zeile wird noch eingesetzt
      ;... Zeile wird noch eingesetzt
      (while(>(getvar "cmdactive")0)(command))
      (princ(strcat "\n"name": previous Handler = "))
      (princ previousHandler)
      (command"_undo""_end")
      (if undo(command"_u"))
      (foreach pair savedVars
        (setvar(car pair)(cdr pair))
        (princ
          (strcat"\n"name": Setze \""
                    (car pair)"\" zurück auf "))
        (princ(cdr pair))
      )
      (setq *error* previousHandler)
      (if msg
        (progn
          (princ(strcat"\n" name ": \"" msg "\""))
          (if previousHandler(previousHandler msg))
        )
      )
    )
  )
  ;************
  (command"_undo""_begin")
  (foreach pair varsToSave
    (setq saveList
      (cons
        (cons(car pair)(getvar(car pair)))
        saveList
      )
    )
    (setvar(car pair)(cdr pair))
  )
  (setq *error*
    (append
      (list(car ErrorTemplate))
      (if undomode'((setq undo 'T)))
      (list
        (list 'setq
          'PreviousHandler
          (cons'quote(list *error*))
        )
      )
      (list(list 'setq 'name name))
      (list
        (cons'setq
          (cons'savedvars
            (list(cons'quote(list savelist)))
          )
        )
      )
      (cdr ErrorTemplate)
    )
  )
)
(defun endErrorHandler( / )
  (*error* nil)
)


Peter2

Beiträge: 3727 / 4

Win 10/64 Pro
AutoCAD MAP 3D 2023
BricsCAD 22

Zitat:
Original erstellt von Temuedschin:
...Hat sich bezüglich *error* handler in den letzten jahren so wenig getan, dass man auch die alten bedenkenlos einsetzen kann?...

Ich wüsste nicht,  was sich zwischen alt und neu geändert haben sollte. Der Zweck ist der wie du schreibst: Variablen zurücksetzen, evtl. _undo, ...
Vielleicht hat sich eine Variable geändert oder eine neue ist betroffen, aber das muss man sowieso klären bzw. sieht man im Hauptcode.

Der gezeigte Code ist natürlich "_advanced", manchmal geht es auch mit 2-3 Zeilen. Aber das scheint ja nichts neues für dich zu sein.