Expat解析器- c++ -异常处理
Expat parser - c++ -Exception handling
我已经注册了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。在从处理程序抛出异常之前,我必须执行任何其他操作吗?
谢谢。
您在try
和catch
之间有一个不匹配:每个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解析)。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析