Common Lisp the Language, 2nd Edition
 
 
 
  
  
  
  
 

When *print-escape* is nil (for example,
when the princ function or the ~A
directive is used with format), the report method for the condition will be invoked. This will
be done automatically by functions such as invoke-debugger, break, and warn,
but there may still be situations in which it is desirable to have a
condition report under explicit user control. For example,
(let ((form '(open "nosuchfile"))) 
  (handler-case (eval form) 
    (serious-condition (c) 
      (format t "~&Evaluation of ~S failed:~%~A" form c))))
might print something like
Evaluation of (OPEN "nosuchfile") failed: The file "nosuchfile" was not found.
Some suggestions about the form of text typed by report methods:
When *print-escape* is not nil, the object should print in some useful (but usually fairly abbreviated) fashion according to the style of the implementation. It is not expected that a condition will be printed in a form suitable for read. Something like #<ARITHMETIC-ERROR 1734> is fine.
X3J13 voted in March 1989 (ZLOS-CONDITIONS) to integrate the Condition System and the Object System. In the original Condition System proposal, no function was provided for directly accessing or setting the printer for a condition type, or for invoking it; the techniques described above were the sole interface to reporting. The vote specified that, in CLOS terms, condition reporting is mediated through the print-object method for the condition type (that is, class) in question, with *print-escape* bound to nil. Specifying (:report fn) to define-condition when defining condition type C is equivalent to a separate method definition:
(defmethod print-object ((x C) stream) 
  (if *print-escape* 
      (call-next-method) 
      (funcall #'fn x stream)))
Note that the method uses fn to print the condition
only when *print-escape* has the value nil.
 
 
 
  
  
  
 