blob: 952858465c554899e34719b9442dddb7de5640d4 [file] [log] [blame]
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.");
}