On 2011-07-16 18:04:37 +0200, Paavo Helde said:
@online.de:
I'm a little bit closer on the problem context, I have mixed C and
C++ code in the class that throws the exception.
[...]
problem. I try to recompile my sources with the -fexceptions flag,
but that does not wort. Shoud I compile my C libraries with the
flag?
The -fexceptions flag should not have any effect on C++ code
whatsoever. You need this for compiling any C code which is
supposed to let C++ exceptions propagate through it. On Windows
platform MSVC implements exceptions at the OS level so there is no
such special flag needed for C code, but things may be different
with cygwin or gcc.
I think this question is off-topic, but do you know a working
solution for g++? I have compiled all my libraries and my code with
g++ / gcc, so should I set the
-fexceptions flag on each library or only on my code?
I don't know if this is off-topic or not, there is too less
information. For example it is not clear what you mean exactly by
"mix of C and C++ in the class" and if "your code" is C or C++. Maybe
you could post a minimal example demonstrating the problem?
It's very simple. I use the libxml2 functions for parsing XML data.
The library have some error function / callback function for detecting
errors during the parsing.
You mention a callback function, but there is no callback function in
your example code. Do you use xmlSetGenericErrorFunc()? If yes, then this
should be included in the example.
eg:
my xmlclass {
public:
doxml( std::string p_xml ) {
xmlParseMemory(p_xml.c_str)
if (xmlErrorDetect()) {
xmlClear()
throw std::runtime_error("error")
}
}
}
In my main function
{
myxmlclass obj;
try {
obj.doxml("abcdef");
} catch (...) {
std::cout << "exception is caught" << std::endl;
}
}
This code does not compile (lots of missing semicolons and other errors),
neither does it throw exceptions through C code, so I believe it has no
relevance to your real problem. Please post a compilable example
demonstrating the problem!
The original excerpt of the method is:
xmlResetLastError();
bool l_error = false;
xmlGenericErrorFunc l_fptr = myclass::XMLErrorFunction; <=
XMLErrorFunction is a static
method of the class which is empty to supress parsing content on the CLI
initGenericErrorDefaultFunc( &l_fptr );
const char* l_xmlcontent = p_xml.c_str();
xmlDocPtr l_xml = xmlParseMemory( l_xmlcontent,
strlen(l_xmlcontent) );
if ((!l_xml) || (xmlGetLastError())) {
if (l_xml)
xmlFreeDoc( l_xml );
xmlCleanupParser();
throw std::runtime_error("XML data can not be parsed"); <=
this exception is thrown, but can not be caught /
here I have tested with std::exception, derivated exceptions...
}
AFAIK -fexceptions are not enabled by default for C code, are you sure
that the libxml2 library has been compiled with -fexceptions?
I have testet with and without compiling -fexceptions, both test are
create the same problem.
You cannot solve the problem without understanding it. Throwing
exceptions through non-C++ code is undefined behavior, but your example
does no such thing, so I'm not sure either where the problem is.
I have create a class, that uses with external C includes the libxml2
calls for parsing XML data. In this class I throw an
exception (see excerpt), which should be caught in the main. On Linux
and OSX g++ it works, exception is thrown and caught.
On Windows (g++ under Cygwin) the exception is thrown (checked with
gdb) but not caught. Windows creates the message:
terminate called after throwing an instance of <exception> terminate
called recursively
The library is compiled on all three systems with gcc and my code with
g++. All compilers are version 4.x, only the subversions
are different
Phil