Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Expat解析器-c++-异常处理_C++_Exception Handling_Expat Parser - Fatal编程技术网

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

C++ Expat解析器-c++-异常处理,c++,exception-handling,expat-parser,C++,Exception Handling,Expat Parser,我已向expat parser注册了三个处理程序: -开始 -结束 -正文 从主程序中,我读取xml文件,对其进行缓冲并调用xml_Parse API。 大概是这样的: try { if( ! XML_Parse (....)) { // throw user-defined expection here } catch(...) { } } // end of try catch(...) { } try { // stuff before try { if (

我已向expat parser注册了三个处理程序: -开始 -结束 -正文

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

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

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

  // further catch blocks?

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

  // stuff after
}
如果XML_Parse在失败时返回0,则会从If内部引发异常。它被卡在内挡块中

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

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


谢谢。

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

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

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

  // further catch blocks?

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

  // stuff after
}

请注意,匿名
catch(…)
通常不是很好的设计-您要么知道自己的期望并能够处理什么,要么不需要捕获它。匿名捕获唯一有用的事情是记录异常并重新显示它。

如果从
try{/*stuff*/}
块中抛出异常,并且
抛出
嵌套得很深,堆栈将一直展开到匹配的外部
捕获(…)
函数。如果处理程序分配了堆内存,则需要使用
shared\u ptr
或明确小心地删除。如果您的处理程序在
try
块中,那么异常应该正常运行。

对此必须非常小心。(这导致我正在处理的某些代码中出现了一些很难追踪的问题。)。在我的例子中,我必须使用的expat lib不是使用gcc中所需的异常标志构建的,而且由于expat是C(而不是C++),它不知道如何处理异常——当出现异常时,应用程序刚刚终止


但是,如果您可以使用正确的gcc标志构建expat,那么所有这些都应该是可以的。(重建expat对我来说是不可能的,所以我改用libxml2进行DOM解析)。

对不起。没有内部陷阱。尝试之后只有一个陷阱。因此,有两个地方可以抛出异常。一个来自内部if,另一个来自任何处理程序。那么,当异常从处理程序中抛出时,它是如何表现的呢?而且,匿名捕获只是用来描述这个问题。我有适当的捕捉块来处理抛出的物体。我主要关心的是如果处理程序抛出异常会发生什么?