[经验总结]MSXML错误处理代码

本文介绍了一种使用MSXML组件处理XML文档时的错误处理方法。通过捕获并解析IXMLDOMParseError对象来获取详细的错误信息,如错误代码、行号及原因等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用MSXML组件处理XML文档出错时,需要给出详细的错误信息。大部分代码只是简单的返回错误提示,SDK文档也没给出例程,无奈之下只得又求助于Google代码搜索,还好,很快就找到合适的例程,稍微改造一下,纳入自己的代码库。

错误处理代码如下:

MSXML2::IXMLDOMParseError *pXMLError = NULL; // For XML errors LONG nErrorCode = E_FAIL; // For error codes if(pXMLLicenseDoc->loadXML(m_sLicense) != VARIANT_TRUE) // failed to load the license { wstring wstrErr; (wstrErr).assign(L"/r/n"); (wstrErr).append(L"Failed to load the License /r/n"); hr = pXMLLicenseDoc->get_parseError(&pXMLError); if(NULL != pXMLError) { hr = pXMLError->get_errorCode(&nErrorCode); if (nErrorCode != 0) { wstring wstrTmpErr; hr = ReportError(&wstrTmpErr, pXMLError); (wstrErr).append(wstrTmpErr); } pXMLError->Release(); } return -1; } //END IF

统一的错误报告由下面的ReportError函数生成:

//------------------------------------------------------------------------- //--FUNCTION ReportError //------------------------------------------------------------------------- //--This function is used for reporting parsing errors which occur during the // loading of xml into a IXMLDOMDocument2Ptr object. //--Parameters: // wostream &wout-> a wide output stream to which the error report will be output to. // IXMLDOMParseError *pXMLError -> contains the error info. //------------------------------------------------------------------------- HRESULT CGUtil::ReportError(wstring* pwstrErr, MSXML2::IXMLDOMParseError *pXMLError) { long line; long linePos; LONG errorCode; BSTR pBReason = NULL; HRESULT hr; if(NULL == pXMLError) { return E_INVALIDARG; }//END IF hr = pXMLError->get_line(&line); if (SUCCEEDED(hr)) { hr = pXMLError->get_linepos(&linePos); if (SUCCEEDED(hr)) { hr = pXMLError->get_errorCode(&errorCode); if (SUCCEEDED(hr)) { hr = pXMLError->get_reason(&pBReason); if (SUCCEEDED(hr)) { (*pwstrErr) += pBReason; if (line > 0) { (*pwstrErr).append(L"Error on line "); char num1 [10]; _itoa(line, num1, 10); BSTR bs = _com_util::ConvertStringToBSTR(num1); (*pwstrErr).append(bs); (*pwstrErr).append(L", position "); _itoa(linePos, num1, 10); bs = _com_util::ConvertStringToBSTR(num1); (*pwstrErr).append(bs); (*pwstrErr).append(L"."); }//END IF }//END IF }//END IF }//END IF }//END IF if(NULL != pBReason) SysFreeString(pBReason); //END IF return hr; }//END FUNCTION ReportError

上述代码参考这个链接:http://www.google.com/codesearch/p?hl=zh-CN#iA8V4e3Y9hQ/ittf/PubliclyAvailableStandards/c043931_ISO_IEC_14496-5_2001_Amd_9_2007_Reference_Software.zip%7CM6AqbSWOJ78/C043931e_Electronic_inserts/Systems/Systems/IM1/IPMP-X/IPMP_RELTool/CGUtil.cpp&q=msxml%20loadXML%20lang:c++&d=9

再次感谢Google,将有用的信息带给我们,给予程序员们更好的学习机会和无尽的自由!

在此描述您的新便笺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值