【问题标题】:Expat parser - c++ -Exception handlingExpat 解析器 - c++ - 异常处理
【发布时间】:2011-10-27 12:36:09
【问题描述】:

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

从主程序中,我读取 xml 文件,对其进行缓冲并调用 XML_Parse API。 像这样的:

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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    trycatch 不匹配:每个 try 块后面至少有一个 catch 块,但您只有一个 try。可能是这样的:

    try
    {
      // stuff before
    
      try
      {
        if (!parse())
        {
          // ...
        }
      }
    
      // further catch blocks?
    
      catch(...)
      {
        // may rethrow
      }
    
      // stuff after
    }
    

    请注意,匿名catch(...) 通常不是很好的设计——您要么知道自己期望什么并且可以处理,要么不需要抓住它。匿名捕获唯一有用的事情就是记录异常并重新抛出它。

    【讨论】:

    • 对不起。没有内部捕获。 try 之后只有一个 catch 。因此,有两个地方可能会引发异常。一个来自内部 if,另一个来自任何 HANDLERS。那么,当 HANDLERS 抛出异常时,它的表现如何?
    • 而且,匿名捕获只是为了描述问题。我有适当的捕获块来处理抛出的物体。我主要关心的是如果 HANDLERS 抛出异常会发生什么?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        相关资源
        最近更新 更多