C++中的try块中出现的异常不被处理

idfiyjo8  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(79)

我有以下代码:

#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,所以可能有些东西我不明白。我一直在寻找解决办法,但我找不到任何一个。

7uzetpgm

7uzetpgm1#

在C中捕获 * all * 异常是用catch(...)完成的,而不是catch(const std::exception& e)。不要求异常类型与std::exception相关。可以引发任何类或标量类型。从std::exception派生异常类型只是C标准库本身遵循的一种模式。
当然,这样你就不知道异常在处理程序中的类型是什么,你也不能像在下面的例子中那样访问它。e.what()
相反,请查看您正在调用的函数的文档以及它应该抛出哪些类型的异常,然后为这些类型编写特定的处理程序并使用特定异常类型提供的接口。

相关问题