我一直在努力弄清楚为什么我的应用程序没有捕获从StartElement事件处理程序抛出的异常,这些异常使用了expat解析器(在C中)。应用程序只是终止说它找不到catch块,尽管我已经有了所有的catch块。只是因为异常是从我自己的事件处理程序抛出的,所以expat的XML_Parse API无法将它传递给我拥有所有catch块的代码。其中一个名为'Michael Anderson'的stackoverflow用户建议使用必要的gcc标志重建expat lib以使expat lib处理异常。有人能让我知道那些是什么标志吗?或者建议一个更好的方法来处理事件处理程序中的错误startelement,endelement等。
如果我在注册的事件处理程序中遇到任何异常,我会以某种方式希望XML_Parse API返回0。请帮忙。提前谢谢。
以下是代码:
try
{
if( ! XML_Parse(.....) )
{
throw exception;
}
}
catch(...)
{
}
在工作场景中,如果XML_Parse遇到格式错误的xml文件,它会立即返回零,然后我进入if block并抛出异常,并且它被捕获。 但在有问题的情况下,异常是从事件处理程序抛出但我的应用程序转储核心,核心堆栈说它找不到catch并最终调用std :: terminate和abort。 现在,当我想从事件处理程序抛出用户定义的异常时,如何使XML_Parse返回零?
答案 0 :(得分:2)
根据expat.h,当您在处理程序中遇到可以中止解析的错误时,您应该调用XML_StopParser(parser,0)。
然后,XML_Parse将返回XML_FALSE。此时,您可以调用特定于应用程序的错误处理