Common Lisp the Language, 2nd Edition
Next: Program Interface to
Up: Survey of Concepts
Previous: Condition Handlers
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:
-
The message should generally be a complete sentence, beginning with a
capital letter and ending with appropriate punctuation (usually a period).
-
The message should not include any introductory text such as ``Error:''
or ``Warning:'' and should not be followed by a trailing newline. Such
text will be added as may be appropriate to context by the routine invoking
the report method.
-
Except where unavoidable, the tab character (which is only semi-standard anyway)
should not be used in
error messages. Its effect may vary from one implementation to another and may
cause problems even within an implementation because it may do different
things depending on the column at which the error report begins.
-
Single-line messages are preferred, but newlines in the middle of long
messages are acceptable.
-
If any program (for example, the debugger) displays messages indented from the
prevailing left margin (for example, indented seven spaces because they
are prefixed by the seven-character herald ``Error: ''), then that program
will take care of inserting the appropriate indentation into the extra
lines of a multi-line error message. Similarly, a program that prefixes
error messages with semicolons so that they appear to be comments should
take care of inserting a semicolon at the beginning of each line in a
multi-line error message. (These rules are important because, even within
a single implementation, there may be more than one program that presents
error messages to the user, and they may use different styles of
presentation. The caller of error cannot anticipate all such possible
styles, and so it is incumbent upon the presenter of the message to make
any necessary adjustments.)
[Note: These recommendations expand upon those in section 24.1.-GLS]
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.
Next: Program Interface to
Up: Survey of Concepts
Previous: Condition Handlers
AI.Repository@cs.cmu.edu