[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

What happens when no handler is found?

    Date: Sat, 4 Jan 86 18:31:03 CST
    From: marick@gswd-vms (Brian Marick)

    A comment on Kent Pitman's error-handling proposal:   (Reposting)

    Having SIGNAL return NIL if no handler is found makes me nervous; it seems
    to assume that people will explicitly plan for the case where no handler is
    found, whereas I expect many people will create bugs because they implicitly
    assume that their condition will be handled.  And even if detecting the case
    of a missing handler by checking whether SIGNAL returns is OK, that doesn't
    work with SIGNAL-CASE, which is expected to return and may return any value.

This is all based on the idea that there are two kinds of conditions:
errors and simple events.  SIGNAL cannot return NIL when signalling an
error because the system guarantees that there is a default handler for
errors, which typically enters a debugger.  Whether a condition is an error
or not is defined by inheritance from its parent.

I suppose SIGNAL-CASE of a simple event with no handler simply returns NIL
without executing any of the clauses, but the proposal doesn't say anything
about that.

    There's a distinction between code that's sending a signal to ask for help
    and code that's sending a signal because there's nothing left for it to do,
    no matter what.  How that distinction meshes with the definitions of SIGNAL,
    SIGNAL-CASE, ERROR, and ERROR-CASE is not clear enough.

I consider it a good idea to use the ERROR function when there's nothing left to
do, thus making it clear that you don't expect a return.

    SIGNAL-CASE -- by default, it is an error (as above) for no handler to be
    found. If one of the clauses of the SIGNAL-CASE is headed by :NO-HANDLER (or
    a list containing :NO-HANDLER), that the body of that clause is invoked.

This would be a reasonable alternative to what I supposed in my second paragraph.