Next: Processing of Errors, Previous: Errors, Up: Errors [Contents][Index]
Most errors are signaled “automatically” within Lisp primitives
which you call for other purposes, such as if you try to take the
CAR of an integer or move forward a character at the end of the
buffer; you can also signal errors explicitly with the functions
error, signal, and others.
Quitting, which happens when the user types C-g, is not considered an error, but it is handled almost like an error. See Quitting.
SXEmacs has a rich hierarchy of error symbols predefined via
deferror.
error
  syntax-error
    invalid-read-syntax
    list-formation-error
      malformed-list
        malformed-property-list
      circular-list
        circular-property-list
  invalid-argument
    wrong-type-argument
    args-out-of-range
    wrong-number-of-arguments
    invalid-function
    no-catch
  invalid-state
    void-function
    cyclic-function-indirection
    void-variable
    cyclic-variable-indirection
  invalid-operation
    invalid-change
      setting-constant
    editing-error
      beginning-of-buffer
      end-of-buffer
      buffer-read-only
    io-error
      end-of-file
    arith-error
      range-error
      domain-error
      singularity-error
      overflow-error
      underflow-error
The five most common errors you will probably use or base your new
errors off of are syntax-error, invalid-argument,
invalid-state, invalid-operation, and
invalid-change.  Note the semantic differences:
syntax-error is for errors in complex structures: parsed strings,
lists, and the like.
invalid-argument is for errors in a simple value.  Typically, the
entire value, not just one part of it, is wrong.
invalid-state means that some settings have been changed in such
a way that their current state is unallowable.  More and more, code is
being written more carefully, and catches the error when the settings
are being changed, rather than afterwards.  This leads us to the next
error:
invalid-change means that an attempt is being made to change some
settings into an invalid state.  invalid-change is a type of
invalid-operation.
invalid-operation refers to all cases where code is trying to do
something that’s disallowed.  This includes file errors, buffer errors
(e.g. running off the end of a buffer), invalid-change as just
mentioned, and arithmetic errors.
This function signals a non-continuable error.
datum should normally be an error symbol, i.e. a symbol defined
using define-error.  args will be made into a list, and
datum and args passed as the two arguments to signal,
the most basic error handling function.
This error is not continuable: you cannot continue execution after the
error using the debugger r command.  See also cerror.
The correct semantics of args varies from error to error, but for most errors that need to be generated in Lisp code, the first argument should be a string describing the *context* of the error (i.e. the exact operation being performed and what went wrong), and the remaining arguments or \"frobs\" (most often, there is one) specify the offending object(s) and/or provide additional details such as the exact error when a file error occurred, e.g.:
For historical compatibility, DATUM can also be a string.  In this case,
datum and args are passed together as the arguments to
format, and then an error is signalled using the error symbol
error and formatted string.  Although this usage of error
is very common, it is deprecated because it totally defeats the purpose
of having structured errors.  There is now a rich set of defined errors
to use.
See also cerror, signal, and signal-error."
These examples show typical uses of error:
(error 'syntax-error
       "Dialog descriptor must supply at least one button"
	descriptor)
(error "You have committed an error.
        Try something else.")
     error→ You have committed an error.
        Try something else.
(error "You have committed %d errors." 10)
     error→ You have committed 10 errors.
If you want to use your own string as an error message verbatim, don’t
just write (error string).  If string contains
‘%’, it will be interpreted as a format specifier, with undesirable
results.  Instead, use (error "%s" string).
This function behaves like error, except that the error it
signals is continuable.  That means that debugger commands c and
r can resume execution.
This function signals a continuable error named by error-symbol. The argument data is a list of additional Lisp objects relevant to the circumstances of the error.
The argument error-symbol must be an error symbol—a symbol
bearing a property error-conditions whose value is a list of
condition names.  This is how SXEmacs Lisp classifies different sorts of
errors.
The number and significance of the objects in data depends on
error-symbol.  For example, with a wrong-type-argument
error, there are two objects in the list: a predicate that describes the
type that was expected, and the object that failed to fit that type.
See Error Symbols, for a description of error symbols.
Both error-symbol and data are available to any error
handlers that handle the error: condition-case binds a local
variable to a list of the form (error-symbol .
data) (see Handling Errors).  If the error is not handled,
these two values are used in printing the error message.
The function signal can return, if the debugger is invoked and
the user invokes the “return from signal” option.  If you want the
error not to be continuable, use signal-error instead.
Note: In FSF Emacs signal never returns.
(signal 'wrong-number-of-arguments '(x y))
     error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition"))
     error→ Peculiar error (no-such-error "My unknown error condition")
This function behaves like signal, except that the error it
signals is not continuable.
This macro checks that argument satisfies predicate.  If
that is not the case, it signals a continuable
wrong-type-argument error until the returned value satisfies
predicate, and assigns the returned value to argument.  In
other words, execution of the program will not continue until
predicate is met.
argument is not evaluated, and should be a symbol. predicate is evaluated, and should name a function.
As shown in the following example, check-argument-type is useful
in low-level code that attempts to ensure the sanity of its data before
proceeding.
(defun cache-object-internal (object wlist) ;; Before doing anything, make sure that wlist is indeed ;; a weak list, which is what we expect. (check-argument-type 'weak-list-p wlist) …)
Next: Processing of Errors, Previous: Errors, Up: Errors [Contents][Index]