我有以下代码:
#import <msxml6.dll>
using namespace MSXML2;
...
IXMLDOMSchemaCollectionPtr pXS;
IXMLDOMDocument2Ptr pXD = NULL;
MSXML2::IXMLDOMParseErrorPtr pErr = NULL;
_bstr_t strResult = "";
HRESULT hr = pXS.CreateInstance(__uuidof(XMLSchemaCache60));
CComVariant xsd_file;
_bstr_t bstrXSD(L"test_xsd.xsd");
BSTR empty_bstr = SysAllocString(L"urn:namespace");
try {
hr = pXS->add(_bstr_t(""), bstrXSD);
}
catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
当我运行这个时,我有一个未处理的异常,它发生在hr = pXS->add(_bstr_t(""), bstrXSD);
行上。我不明白异常在try块中被抛出时怎么会被取消处理。
下面是堆栈跟踪:
FacturX_proto.exe!_com_raise_error(HRESULT hr, IErrorInfo * perrinfo) Line 19 C++
FacturX_proto.exe!_com_issue_error(HRESULT hr) Line 40
FacturX_proto.exe!_com_ptr_t<_com_IIID<MSXML2::IXMLDOMSchemaCollection,&_GUID_373984c8_b845_449b_91e7_45ac83036ade>>::operator->() Line 310 C++
我想知道为什么会在那里抛出异常,但要知道我首先需要知道为什么这个异常没有被try/catch块处理。
我不是C++的Maven,所以可能有些东西我不明白。我一直在寻找解决办法,但我找不到任何一个。
1条答案
按热度按时间7uzetpgm1#
在C中捕获 * all * 异常是用
catch(...)
完成的,而不是catch(const std::exception& e)
。不要求异常类型与std::exception
相关。可以引发任何类或标量类型。从std::exception
派生异常类型只是C标准库本身遵循的一种模式。当然,这样你就不知道异常在处理程序中的类型是什么,你也不能像在下面的例子中那样访问它。
e.what()
。相反,请查看您正在调用的函数的文档以及它应该抛出哪些类型的异常,然后为这些类型编写特定的处理程序并使用特定异常类型提供的接口。