OK, here's how to use exceptions in Subversion (latest draft).


1.  Exceptions are stored in svn_error_t structures:

typedef struct svn_error
{
  ap_status_t apr_err;       /* APR error value, possibly SVN_ custom err */
  int src_err;               /* native error code (e.g. errno, h_errno...) */
  const char *message;       /* details from producer of error */
  struct svn_error *child;   /* ptr to the error we "wrap" */
  ap_pool_t *pool;           /* place to generate message strings from */

} svn_error_t;



2.  If you are the *original* creator of an error, you would do
    something like this:

        return (svn_create_error ((ap_status_t) err,
                                  NULL,
                                  "User not permitted to write file."
                                  NULL,
                                  my_pool));


    NOTICE the NULL field... indicating that this error has no child,
    i.e. it is the bottom-most error.  Don't forget to do this!


3.  If you *receive* an error, you have three choices:

    a) Handle the error yourself.  Use either your own code, or just
    call the primitive svn_handle_error(err).  (This routine unwinds
    the stack and prints out messages.)

    b) Throw the error upwards, unmodified:

        error = some_routine (foo);
        if (error)
          return (error);
        
    c) Throw the error upwards, wrapping it in a new error structure
       by including it as the "child" argument:

        error = some_routine (foo);
        if (error)
          {
           svn_error_t *wrapper = svn_create_error (my_errno,
                                                    NULL,
                                                    "Authorization failed.",
                                                    error,
                                                    error->pool);
           return wrapper;
          }


        Of course, there's a convenience routine which creates a
        wrapper error with the same fields as the child, except for your
        custom message:

        error = some_routine (foo);
        if (error)
          {
           return (svn_quick_wrap_error (error, "Authorization failed.");
          }
