//函数功能:
// 打开文件
//函数输入:
// char* pFileName
//  文件名称
// CFile *pFile
//  文件句柄
// int FileType
//  0 源文件,只读文件
//  1 目标文件,创建并可写
//函数返回:
// 0 成功
// 1 指针为空
// 2 文件操作异常
// 3 文件打开失败
int OpenFileEx(char* pFileName, CFile *pFile, int FileType)
{
BOOL bRet = 0;
CFileException e;
if ((pFileName == NULL) || (pFile == NULL))
{
return(1);
}
else
{
try
{
if (FileType == 0)
{
bRet = pFile->Open(pFileName, CFile::modeRead | CFile::typeBinary, &e);
}
else
{
bRet = pFile->Open(pFileName, CFile::modeCreate | CFile::modeWrite, &e);
}
if (bRet == TRUE)
{
return(0);
}
else
{
return(3);
}
}
catch (CFileException e)
{
return(2);
}
}
}
错误信息:
error C2316: “CFileException”: 无法作为析构函数捕获,或者复制构造函数不可访问或已删除,或同时出现这两种情况

解决方案 »

  1.   

    找到解决方法了,将catch (CFileException e)变成catch (CFileException *e)就可以了。
    有人知道这是为什么吗?
      

  2.   


    void AFXAPI AfxThrowFileException(int cause, LONG lOsError,
    LPCTSTR lpszFileName /* == NULL */)
    {
    #ifdef _DEBUG
    LPCSTR lpsz;
    if (cause >= 0 && cause < _countof(rgszCFileExceptionCause))
    lpsz = rgszCFileExceptionCause[cause];
    else
    lpsz = szUnknown;
    TRACE3("CFile exception: %hs, File %s, OS error information = %ld.\n",
    lpsz, (lpszFileName == NULL) ? _T("Unknown") : lpszFileName, lOsError);
    #endif
    THROW(new CFileException(cause, lOsError, lpszFileName));
    }
      

  3.   

    CFile 投递的 CFileException 是 new 出来的
    另外 catch 中 还要对应的 Deletetry
    {
        // Do something to throw a file exception.
    }
    catch( CFileException* theException )
    {
        if( theException->m_cause == CFileException::fileNotFound )
            TRACE( "File not found\n" );
        theException->Delete();
    }