Expat解析器- c++ -异常处理

Expat parser - c++ -Exception handling

本文关键字:c++ 异常处理 Expat      更新时间:2023-10-16

我已经注册了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。在从处理程序抛出异常之前,我必须执行任何其他操作吗?

谢谢。

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

try
{
  // stuff before
  try
  {
    if (!parse())
    {
      // ...
    }
  }
  // further catch blocks?
  catch(...)
  {
    // may rethrow
  }
  // stuff after
}
请注意,匿名catch(...)通常不是很好的设计——你要么知道你期望什么,可以处理什么,要么你不需要捕捉它。对于匿名捕获来说,唯一有用的事情就是记录异常并重新抛出它。

如果从try{/*stuff*/}块中抛出异常,并且throw嵌套很深,则堆栈将一直展开到匹配的外部catch(...)函数。如果处理程序已经分配了堆内存,则需要通过使用shared_ptr<>或显式地删除和小心地来处理这个问题。如果您的处理程序在try块内,那么异常应该表现正常。

你必须非常小心。(这导致我在编写的一些代码中出现了一些非常难以追踪的问题。)在我的例子中,我必须使用的expat库不是使用gcc中所需的异常标志构建的,而且由于expat是C(而不是c++),它不知道如何处理异常——当一个异常发生时,应用程序就终止了。

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