Expat解析器 - c ++ -Exception处理

时间:2011-10-27 12:36:09

标签: c++ exception-handling expat-parser

我已经使用expat解析器注册了三个处理程序: - 开始 -结束 - 文字

从主程序中,我读取了xml文件,缓冲它并调用XML_Parse API。 像这样:

try {
if( ! XML_Parse (....))
{
   // throw user-defined expection here
}
catch(...)
{
}
} // end of try
catch(...)
{
 }

如果XML_Parse在失败时返回0,则从内部抛出异常if。并且它被捕获在内部捕获块中。

这是我的问题: 如果在解析过程中从任何处理程序抛出了用户定义的异常,那么它是否会被外部catch捕获?

如果是,它实际上没有发生在我的代码中。相反,它正在转储核心和堆栈显示throw会导致std:terminate。 在从HANDLERS抛出异常之前,我是否必须执行任何其他操作。

感谢。

3 个答案:

答案 0 :(得分:0)

trycatch之间存在不匹配:每个try块后面至少有一个catch块,但您只有一个try 。也许是这样的:

try
{
  // stuff before

  try
  {
    if (!parse())
    {
      // ...
    }
  }

  // further catch blocks?

  catch(...)
  {
    // may rethrow
  }

  // stuff after
}

请注意,匿名catch(...)通常不是很好的设计 - 你要么知道你期望和能够处理什么,要么你不需要抓住它。关于匿名catch要做的唯一有用的事情是记录异常并重新抛出它。

答案 1 :(得分:0)

如果从try{/*stuff*/}块中抛出异常并且throw被深深嵌套,则堆栈将一直展开到匹配的外部catch(...)函数。如果处理程序已分配堆内存,则需要使用shared_ptr<>或明确删除 来处理。如果处理程序位于try块内,则异常应该正常。

答案 2 :(得分:0)

你必须非常小心。 (它导致一些非常难以追踪我正在处理的一些代码中的问题。)在我的情况下,我必须使用的expat libs不是使用gcc中所需的异常标志构建的,并且由于expat是C(而不是C ++),它不知道如何处理异常 - 当一个发生时,应用程序刚刚终止

但是如果你可以用正确的gcc标志构建expat,那么一切都应该没问题。 (重建expat对我来说是不可能的,所以我改用了使用libxml2的DOM解析)。