我已经使用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抛出异常之前,我是否必须执行任何其他操作。
感谢。
答案 0 :(得分:0)
try
与catch
之间存在不匹配:每个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解析)。