[cairo] cairomm exception handling questions
Ian Britten
britten at caris.com
Mon Aug 11 11:45:35 PDT 2008
Murray Cumming wrote:
>> - After some trial-and-error (And grubbing through the cairomm
>> source code), I've discovered that passing an invalid file name
>> to PdfSurface::create() doesn't throw a Cairo::logic_error
>> exception, but instead, a std::ios_base::failure exception.
>
> As you can see in the implementation here:
> http://cgit.freedesktop.org/cairomm/tree/cairomm/private.cc
> this is the (indirectly) recommended exception for this cairo error:
> http://cairographics.org/manual/bindings-errors.html
Thanks (And to Jonathon too) - Very helpful. I'm still new to Cairo,
and am still finding/reading documentation.
> But if we are wrong about that, changing the exceptions thrown would
> generally be an API and ABI break - applications that expected the
> existing exceptions would no longer work.
Ya, sorry - I wasn't necessarily suggesting changing it. I was
mostly commenting on the perceived awkwardness, and wondering about
the reason/intent.
>> Wouldn't it make it more consistent to throw all cairomm
>> exceptions as Cairo::logic_error? Currently, I (as a programmer
>> trying to trap all Cairo exceptions and downgrading them to
>> errors) must add multiple 'catch' statements to all my 'try'
>> statements. That seems like it'll get repetitive/tedious pretty
>> quickly.. :(
>
> Of course you shouldn't be catching the exceptions for every call.
> That's why they are exceptions.
Admittedly, my experience with exceptions is fairly limited.
However, as a library writer trying to add a Cairo 'canvas' to
our existing framework, I would think that I would want to catch
the exceptions, wouldn't I? The higher-level code is certainly
NOT exception-safe, and I'm trying to ensure no exceptions(*)
propagate out. [ Thoughts/Suggestions/Guidelines welcome ]
(*) Admittedly, exceptions like 'new' are a bit different, but I'm
mostly interested in the cairo-specific errors/problems that I
can fix/prevent/handle/etc.
> I think it's more important that we document what exceptions can be
> thrown by what methods. But to know that we need to know what errors can
> be set by what C functions and that's lacking from the cairo
> documentation currently. For instance:
> http://www.cairographics.org/manual/cairo-PDF-Surfaces.html#cairo-pdf-surface-create
I'm note sure that an exact listing of errors for each method/function
(And all the child calls) would be feasible - It'd certainly seem to
me to be tedious to maintain (And I don't think I'd want to do it!)
However, the information you indicated on that link seems adequate
for programming with. I guess my problem was I had only looked at
http://www.cairographics.org/documentation/cairomm/reference/classCairo_1_1PdfSurface.html#92403fe5ad8ae6862e005c3d185e9123
which doesn't give any information about errors.
Since it throws an exception on bad input, I don't get a surface
object back to query though, leaving me trying to catch exceptions,
analyze them, etc.
>> - What am I expected to do with a Cairo::logic_error exception? I
>> had been planning to try use the ErrorStatus (cairo_status_t) to
>> return a meaningful error to the calling code. However, it seems
>> that I can't access the status (private, no 'get').
>
> Good point. I guess there should be a get_error_code() method. A patch
> would be welcome.
I'll see what I can do - No promises though (I'm already involved
with several OpenSource projects, and develop full time all day...)
Ian
More information about the cairo
mailing list