捕捉不到CArchiveException endOfFile的异常


vs2008,在while循环为FALSE的情况下,他会报一个CArchiveException endOfFile的异常
但是我加了TRY CATCH以后,却捕捉不到这个异常
代码很简单,给出解决方案之前,麻烦先自己试一下

代码如下:
CFile file;

file.Open(m_strFileName, CFile::modeRead);

CArchive arf(&file, CArchive::load);

TRY
{
CString rString;

while(arf.ReadString(rString))
{
m_arrContent.Add(rString);
}
}
CATCH(CArchiveException, e)
{
if (e->m_cause & CArchiveException::endOfFile)
{
AfxMessageBox("You have reached the end of the file!");
}

}
END_CATCH

11 个解决方案

#1


EOF会导致ReadString返回0,正常退出循环。

#2


vc6测试的。

#3


用一个变量读取arf.ReadString(rString)返回值,然后再处理.EOF应该也会有一个返回值

#4


CATCH(CArchiveException, e)
{
if (e->m_cause == CArchiveException::endOfFile)
{
DELETE_EXCEPTION(e);
if (nRead == 0)
return NULL;
}
else
{
THROW_LAST();
}
}
mfc源代码里把eof屏蔽了?

#5


使用的是BOOL ReadString(
   CString& rString 
);
返回值就是BOOL类型的

这个异常并不影响使用,只是在调试的时候,会在vs2008的即时窗口显示一条异常信息,看看有没有办法去掉

#6


VS2005也是一样。MS在内部被DELETE掉了。
LPTSTR CArchive::ReadString(__out_ecount_z_opt(nMax+1) LPTSTR lpsz, UINT nMax)
{
// if nMax is negative (such a large number doesn't make sense given today's
// 2gb address space), then assume it to mean "keep the newline".
int nStop = (int)nMax < 0 ? -(int)nMax : (int)nMax;
ASSERT(AfxIsValidAddress(lpsz, (nStop+1) * sizeof(TCHAR)));

if(lpsz == NULL)
return NULL;

_TUCHAR ch;
int nRead = 0;

TRY
{
while (nRead < nStop)
{
*this >> ch;

// stop and end-of-line (trailing '\n' is ignored)
if (ch == '\n' || ch == '\r')
{
if (ch == '\r')
*this >> ch;
// store the newline when called with negative nMax
if ((int)nMax != nStop)
lpsz[nRead++] = ch;
break;
}
lpsz[nRead++] = ch;
}
}
CATCH(CArchiveException, e)
{
if (e && e->m_cause == CArchiveException::endOfFile)
{
DELETE_EXCEPTION(e);
if (nRead == 0)
return NULL;
}
else
{
THROW_LAST();
}
}
END_CATCH

lpsz[nRead] = '\0';
return lpsz;
}

好像也没啥解决方案。蹭分~

#7


调试窗口是显示的first-chance exception吧?这个没关系的。

#8


调试窗口是显示的first-chance exception吧?这个没关系的。

#9


引用 8 楼 ndy_w 的回复:
调试窗口是显示的first-chance exception吧?这个没关系的。


我也觉得没啥关系,就是看着不爽,洁癖

#10


用这个重载的函数
LPTSTR ReadString(
   LPTSTR lpsz,
   UINT nMax 
);

In the version that returns an LPTSTR, a pointer to the buffer containing the text data; NULL if end-of-file was reached. 

#11


引用 10 楼 visualeleven 的回复:
用这个重载的函数
LPTSTR ReadString(
  LPTSTR lpsz,
  UINT nMax 
);

In the version that returns an LPTSTR, a pointer to the buffer containing the text data; NULL if end-of-file was reached.


还是会存在,看上面贴出的源代码,这个异常应该是出在ReadString内部,应该是避免不了了,呵呵
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告