Re: c++-Exception-Handling when using the jpeglib
On Sep 24, 5:20 pm, "f.las...@pilz.de" <f.las...@pilz.de> wrote:
Hi!
Could anyone provide a solution for my problem:
I use the (C-written) jpeglib and I want to provide my own error
handler, implemented with try/catch. I don't have any idea why it
doesn't work. After I read the documentation of the library, lngjmp
and setjmp are proposed to handle errors properly. MSDN says: "DO not
use setjmp/lngjmp" within c++-applications. So I tried the following:
[snip]
The Problem is: when an error comes up, my code walks straight into
the ErrorHandler (checked with a printout "In Errorhandler") but then,
after the exception has been thrown, never goes back to the catch-
branch.
Does anyone have a better idea or even a solution, what I did wrong?
I've solved the similar problem when writing a C++ wrapper for
libpng. Please refer to http://savannah.nongnu.org/projects/pngpp/
for details.
Simply put, it took me to wrap every single function in C library
which might fail and return control via longjmp like this:
void png::reader::read_info(void)
{
if (setjmp(m_png->jmpbuf)) // one might use a macro for this
{
throw error(m_error);
}
m_info.read();
}
The longjmp itself is called by our error handler like this:
void png::io_base::raise_error(png_struct* png, char const* message)
{
...
io->set_error(message);
longjmp(png->jmpbuf, -1);
}
It also stores error message to be thrown later from C++ code.
This way, setjmp/longjmp is used to transfer control only in C code
(or at least C-style) and you get library errors "converted" to C++
exceptions. I believe it's pretty safe as well. :-)
--
Cheers,
Alex
PS: Actually I started to write jpeg++, my wrapper for jpeglib the
same time I started png++, but it never get matured for an initial
release... If there is an interest within the community in such a
wrapper, I might put some effort into making one, however, I never
know if I'll have enough spare time for this... ;-)
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]