由于做EasyNews我开始使用TXMLDocument,但是很遗憾的是,出现了一些莫名其妙的错误。基本代码如下:
//这里没有写错,TXMLDocument的构建函数就是这么定义的
//很奇怪的做法,一般来说T打头的都是VCL类,需要一个宿主
//但是这个类不需要宿主
TXMLDocument* MyXml=new TXMLDocument("");
try
{
MyXml->LoadFromFile("test.xml");
}
catch(...)
{
MyXml->DocumentElement=MyXml->CreateElement(
"Test","http://www.tinydust.net/easynews");
}
具体错误是,只要我的test.xml文件不存在或者不是合法的xml文件的时候,MyXml->CreateElement的运行也是错误的。这个错误很奇怪,我百思不得其解,开始认为可能是LoadFromFile失败以后,对MyXml对象的状态做了改变,比如关闭解析等等,但是却找不到判断这个状态和修改这个状态的函数。
我用Google搜索了一下,网上的代码都没有捕捉这个错误,没话说,现在的例程都是这样的,只要功能能实现,错误处理等等都被省略了,这样做出来的程序能可靠么?
最后,我在Borland的新闻组里面的Bcb->Xml部分找到了答案,Remy Lebeau (TeamB)说,不应该建立TXMLDocument的动态实例,而应该使用IXMLDocument接口,NewXMLDocument函数可以返回一个IXMLDocument接口实例。另外,不要手工释放IXMLDocument接口的实例,因为IXMLDocument接口的实例存会自动释放。
所以,我原来的程序被改成了:
_di_IXMLDocument MyXML;
try
{
MyXML=LoadXMLDocument("test.xml");
}
catch(...)
{
MyXML=NewXMLDocument();
MyXML->DocumentElement=MyXML->CreateElement(
"Test","http://www.tinydust.net/easynews");
}
新的代码很稳定,没有出现任何问题,问题很容易就解决了,不过在找到这个文章前,我几乎浪费了一天去寻找原因,真是郁闷。谢谢Remy Lebeau (TeamB),不过话说回来,为什么BCB的文档里面不告诉我们呢,郁闷。
寻找资料的副产品:
Borland的历史
Borland人物
关于TeamB


请不要吝惜您的评论,每一条评论,都是我在漫漫长夜前行的力量
2 条评论:
不错,baby.
11:12 上午
我试过您说的方法,但是还是捕捉不到异常,结果可想而知了
10:35 上午
发表评论
<< 主页