newLISP Fan Club

Forum => Anything else we might add? => Topic started by: Dmi on October 07, 2005, 01:53:56 AM

Title: error handling priority
Post by: Dmi on October 07, 2005, 01:53:56 AM
What is the priority of "error-event" and "catch"?



How can I implement an analog for such pseudocode?:
(try body finish-sequence)
Working so that if body rises error or user throws something, "finish-sequence" is evaluated either, but upper function calling this block will still think that user throw or system error is raised in a "body".



Imitating this with (if (not (catch ...)) ... (throw ...)) will affect error-code, I think. And I also want to distinguish between errors and regular throws...



Really, I can live successful without that now. Just a question about programming... :-)
Title:
Post by: Lutz on October 07, 2005, 05:03:20 AM
Use the second syntax of catch described in the manual and read also about program flow and error catching here:



http://newlisp.org/DesignPatterns.html#program_flow



and here :



http://newlisp.org/DesignPatterns.html#error_handling



Note, that error-event had some limitations in versions previous to 8.6.7 when using in commandline invoked scripts.



You can nest multiple 'catch'. 'error-event' works only the top level when specifying the error version of 'catch' after 'error-event' then 'cath' will take priority.





Lutz
Title:
Post by: Dmi on October 07, 2005, 05:40:57 AM
Oh! Thanks! I forgot about "Design Patterns" :-)

Now it's more clear.
Title:
Post by: Lutz on October 07, 2005, 12:42:33 PM
With the second syntax of 'catch' you can easilyt write a (try body else) yourself:



(define-macro (try body else)
    (if (not (catch (eval body) 'result))
         (eval alternative)
         result)
)

; now try this

(try (+ 3 4) (error-text)) => 7

(try (xyz) (error-text))  

  => "invalid function in function eval : (xyz)"


In the body expression you could use 'throw-error' for exceptions you define your self, and 'else' could contain a more elaborate function to treat an error condition.



Lutz