C++ Expat解析器-c++-异常处理
我已向expat parser注册了三个处理程序: -开始 -结束 -正文 从主程序中,我读取xml文件,对其进行缓冲并调用xml_Parse API。 大概是这样的: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 (
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,另一个来自任何处理程序。那么,当异常从处理程序中抛出时,它是如何表现的呢?而且,匿名捕获只是用来描述这个问题。我有适当的捕捉块来处理抛出的物体。我主要关心的是如果处理程序抛出异常会发生什么?