描述:经常在写程序时,如果操作流程很长,每一部都需检查错误,如果这样将会发现,程序中很多地方需要关闭句柄回收资源等,将会重复性地去回收资源。解决办法:使用GoTo在函数结尾处进行一次回收。此处可以将错误信息统一放在此处输出。
以上出现错误设置一个错误代码,然后使用跳转至指定标签
if (bDoBackupEncFile)
{bSuccess = recoveryManager->EarseRecoveryFile(recoveryFileNew);if (!bSuccess){nErrorCode = 19;goto ErrCleanUp;}}
以上出现错误设置一个错误代码,然后使用跳转至指定标签
ErrCleanUp:
{
if (INVALID_HANDLE_VALUE != hFile)
{
CloseHandle(hFile);
}
if (NULL != recoveryManager)
{
recoveryManager = NULL;
}
if(NULL != recoveryFileNew)
{
recoveryFileNew = NULL;
}
if (NULL != recoveryFile)
{
recoveryFile = NULL;
}
char szHint[1024];
memset(szHint,0,1024);
switch (nErrorCode)
{
case 0:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:打开文件失败",nErrorCode);
break;
case 1:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:创建恢复管理器失败",nErrorCode);
break;
case 2:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:获取文件属性失败或不支持",nErrorCode);
break;
case 3:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:文件头获取失败",nErrorCode);
break;
case 4:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:文件序列号不一致",nErrorCode);
break;
case 5:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:创建加密流程失败",nErrorCode);
break;
case 8:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:解密时备份加密单元失败",nErrorCode);
break;
case 9:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:重新计算加密单元失败",nErrorCode);
break;
case 10:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:解密前锁定文件失败",nErrorCode);
break;
case 11:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:解密加密单元时写失败",nErrorCode);
break;
case 12:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:解密加密单元时读失败",nErrorCode);
break;
case 13:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:加密单元或解密单元为空",nErrorCode);
break;
case 14:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:加密前对加密单元中数据进行备份",nErrorCode);
break;
case 15:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:加密加密单元时写失败",nErrorCode);
break;
case 16:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:加密加密单元时读失败",nErrorCode);
break;
case 17:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:重写文件头失败",nErrorCode);
break;
case 18:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:清除解密备份失败",nErrorCode);
break;
case 19:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:清除加密备份失败",nErrorCode);
break;
default:
sprintf(szHint,"重新加密文件失败,错误代码:%d,原因:未知",nErrorCode);
}
g_objSysErrFile.DoLogMessage(szHint);
return false;
}
return true;
此方式的好处,在于,程序流程比较清析,代码的可读性较好。避免了重复判断资源回收。适合函数代码较长的程序。
核心思想,对错误信息的统一处理。