subversion-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Branko Čibej <br...@apache.org>
Subject Re: svn commit: r1849737 - in /subversion/trunk/subversion/bindings/cxx: include/svnxx.hpp include/svnxx/exception.hpp src/aprwrap/pool.hpp src/exception.cpp src/private/exception-private.hpp tests/test_exceptions.cpp
Date Wed, 26 Dec 2018 21:41:19 GMT
On 26.12.2018 19:50, Daniel Shahaf wrote:
> brane@apache.org wrote on Wed, 26 Dec 2018 04:28 +0000:
>> Reimplement exceptions in SVN++.
>>
>> Instead of extracting error messages from the svn_error_t when the exception
>> is created, keep the svn_error_t embedded in the exception and use its contents
>> only when needed.
>> +++ subversion/trunk/subversion/bindings/cxx/include/svnxx/exception.hpp Wed Dec
26 04:28:25 2018
>> @@ -31,6 +31,46 @@
>> +/**
>> + * @defgroup svnxx_exceptions Exceptions
>> + *
>> + * Exceptions in SVN++
>> + * ===================
>> + *
>> + * SVN++ uses exceptions for the following purposes:
>> + * @li Reporting memory allocation failure; where Subversion's
>> + *     default hehaviour is to abort when an allocation from an APR
>> + *     pool fails, SVN++ throws an exception instead.
>> + * @li Reporting errors; Subversion's error messages are wrapped in
>> + *     exceptions.
>> + * @li Reporting cancelled operations; an operation that was
>> + *     cancelled from user code will report this by throwing a
>> + *     specific exception type.
>> + * @li Terminating iteration; user-level callbacks may throw a
>> + *     specific exception type to cancel an ongoing operation that
>> + *     is generating the callback messages. Other exceptions from
>> + *     user-level callbacks will be propagated back to the calling
>> + *     application.
> This part is an excellent overview; if it's not already in the C doxygen
> docs or in HACKING, it should be (mutatis mutandis).
>
>> + * Exception Hierarchy
>> + * -------------------
>> + *
>> + * All SVN++ exceptions are ultimately derived from @c std:::exception.
>> + *
>> + * * <em>std::exception</em>
>> + *   + <em>std::runtime_error</em>
>> + *     - apache::subversion::svnxx::allocation_failed\n
>> + *       Thrown when memory cannot be allocated from an APR pool
>> + *   + apache::subversion::svnxx::error\n
>> + *     Thrown when an operation failed (see @ref svn_error_t)
>> + *     - apache::subversion::svnxx::canceled\n
>> + *       Thrown when an operation was canceled
>> + *   + apache::subversion::svnxx::cancel\n
>> + *     Thrown by user callbacks to terminate iteration
> I think the last two names here are too similar; it'll be way too easy
> to mis-tab-complete them for each other.  Suggest to rename the second
> one to stop_iteration to match the name of SVN_ERR_STOP_ITERATION.

Actually users can't create objects of type 'svn::canceled' — or at
least not without a lot of effort, as there are no public constructors.
I would hope a smart IDE would notice, or else at least a smart user
will. :)

But yes, I hear you. stop_iteration is a good suggestion.

> Haven't reviewed the rest of the patch, nor the mapping of
> svn_error_t::apr_err values to this hierarchy.

There is just one exception type that encapsulates all of svn_error_t,
including the apr_err bit; that's 'svn::error'. I have no intention of
going down the rabbit hole of having one exception type for each
possible apr_err value!

TL;DR:

class error : public std::exception,
              protected std::shared_ptr<svn_error_t> 
{
public:
  // ...
  const char* what();   // "best" error message (override)
  int code();           // converted apr_status_t
  const char* name();   // symbolic error name, when available
  // ...
};


Mime
View raw message