| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | Exklusives EDU-Programm für RTX PRO Blackwell, eine Pressemitteilung
|
Autor
|
Thema: *error* (1112 mal gelesen)
|
reltro Mitglied student
 
 Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 15. Jun. 2011 11:00 <-- editieren / zitieren --> Unities abgeben:         
Hello all lispler hät da eine Frage bezüglich der *error*-funktion bzw. dessen eigenschaften und methoden eine fehlerbasierte Itteration zu generieren, so alla "try and error" folgendes Konstrukt: (Frage: finde ich den fehler nicht oder ist es einfach nicht möglich) Code:
(defun solve(in i / i in aus) (princ (strcat "\nAnlauf Nr. " (rtos i) " mit VAR: \"in\" = " (rtos in))) (Start_error (strcat "*error*-Handler: " (rtos i)) '(lambda (a / ) (solve (nth (1+ a) '(0 0 1 2 3 4 5)) (1+ a) ) ) i ) ;------------------------------------ ;fehlerquelle! (if (< i (+ 6 1)) (/ 2 (float in)) 'nil ) ;------------------------------------ )(defun Start_error (name expr in / previousHandler msg expr in) (setq PreviousHandler *error* *error* (append (cons '(msg / ) (list (list 'princ (list 'strcat "\n" name ": " 'msg ) ) ) ) (list (list expr in)) (list (list 'setq '*error* (if (null previoushandler) 'nil (list 'Quote PreviousHandler ) ) ) ) ) ) )
Was passiert hier: SOLVE erzeugt einen errorHandler und mit VAR:in=0 den "passenden" Fehler... Im *error*Handler wird beim start durch Start_error ein '(lambda - Ausdruck an den errorHandler weitergegeben, welcher dann die Funktion SOLVE mit einem neuen VAR:in wiederrum aufruft... die VAR:i in SOLVE ist der Zähler welcher den Abbruch der Funktion nach (in diesem Fall) 6 Durchläufen an eine If-Anweisung gibt, sodass die Fehlerquelle nicht ausgeführt werden kann. Die Frage: Fehler im Code, oooooooder ein grundsätzlicher Gedanken-Fehler weil sich der *error* in einer *error*-funktion nicht wohlfühlt? zum Testen: (solve 0 0) (ACHTUNG: !*error* wird am ende verändert sein) lg reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
       

 Beiträge: 4201 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 16. Jun. 2011 01:25 <-- editieren / zitieren --> Unities abgeben:          Nur für reltro
Hallo reltro, ich habe das mal getestet - aber mit der selben Erkenntnis wie du. Du versuchst die Fehlerfunktion (*error*) während diese ausgeführt wird zu überschreiben. Das dürfte meiner Meinung nach nicht funktionieren. Vielleicht solltest du mit (vl-catch-all-apply ..) ein wenig spielen - da läuft der Code auf jeden Fall weiter und du kannst im Falle eines Fehlers entscheiden, was passieren soll. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Jun. 2011 12:01 <-- editieren / zitieren --> Unities abgeben:          Nur für reltro
IMHO  hat die *error* Funktion ausgedient. ich habe mir dazu eine kleine TRY Funktion gebastelt
Code: ;------------------------------------------------------------------------------ ; Testroutine ergibt nil im Fehlerfall ansonst den Rückgabewert der zu ; testenden Funktion ; ist der Rückgabewert der Funktion auch im Erfolgsfall nil ; wird t zurückgegeben ; ; (try '+ (list 1 2 3 4 5 6)) ergibt 21 ; (try '/ (list 5 0)) ergibt nil ;------------------------------------------------------------------------------ (defun Try ( func arg / a1 a2 ) (setq a2 (vl-catch-all-error-p (setq a1 (vl-catch-all-apply func arg)))) (cond (a2 nil) (a1 a1) (t t) ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |