SYNOPSIS
        void runtime_error( string err, string prg, string curobj, int line
                          , mixed culprit, int caught)

DESCRIPTION
        This function has to announce a runtime error to the active
        user. If the user has enough privileges, it might give him the
        full error message together with the source line. Else it
        should issue a decent message ("Your sensitive mind notices a
        wrongness in the fabric of space").

        <err> is the error message, <prg> is the program executed (which
        might be an inherited program), <curobj> is the current object at
        the time of the error. <line> is the linenumber within the program.

        If the error is a normal runtime error, <culprit> is -1. Otherwise,
        the error occurred during a heartbeat and <culprit> is the object which
        heart_beat() function was executed. Also, in case of a heartbeat error,
        the heartbeat for the <culprit> has been turned off.

        If the error is caught on a higher level, <caught> is non-zero;
        otherwise it is 0.

        Note that any of the the objects or programs might be destructed, ie.
        might be passed as 0.

        One common pitfall in the implementation of runtime_error() is
        that runtime_error() itself could run out of evaluation ticks,
        causing a runtime error itself. The workaround is to use
        limited() like this:

          static void
          handle_runtime_error ( string err, string prg, string curobj
                               , int line)
          { ... the actual error handler ... }

          static void
          call_runtime_error (string err, string prg, string curobj, int line)
          {
              limited(#'handle_runtime_error, ({ 200000 }), err, prg, curobj
                     , line);
          }

          void
          runtime_error (string err, string prg, string curobj, int line)
          {
              limited(#'call_runtime_error, ({ LIMIT_UNLIMITED })
                     , err, prg, curobj, line);
          }

HISTORY
        LDMud 3.2.9 added the <culprit> argument.
        LDMud 3.2.12/3.3.705 added the <caught> argument.

SEE ALSO
        log_error(M), heart_beat_error(M), runtime_warning(M),
        raise_error(E), expand_define(E)
