common-lispclozure-cl

How to make Clozure exit when an error occurs


I'm trying to run a program under CCL, so that when the program finishes running for any reason, it should exit back to the operating system. Currently using this command line (on Windows):

\ccl\wx86cl -l test.lisp -e (quit)

This exits when the program successfully runs to normal completion, but if there is an error e.g. out of memory, it ends up in the debugger. How do you tell Clozure to also exit when there is an error?


Solution

  • Not only you want to catch all errors, but you also want to prevent going into the debugger when INVOKE-DEBUGGER is called. You can set *DEBUGGER-HOOK* to a function that quits on unhandled errors.

    $ ./bin/ccl/lx86cl64 
    Clozure Common Lisp Version 1.11.5/v1.11.5  (LinuxX8664)
    
    For more information about CCL, please see http://ccl.clozure.com.
    
    CCL is free software.  It is distributed under the terms of the Apache
    Licence, Version 2.0.
    ? *debugger-hook*
    NIL
    ? (setf *debugger-hook* 
            (lambda (error hook)
              (declare (ignore hook))
              (format *error-output* "Crash: ~a" error) 
              (quit)))
    #<Anonymous Function #x302000998C3F>
    

    Now, test it with an unhandled error:

    ? (error "Oh no")
    Crash: Oh no
    

    Then, you are back to the shell.

    Notice that BREAK always enters the debugger, because it binds *debugger-hook* to NIL (this is on purpose, for debugging).