经过前段时间的工作,现在有些时间能够回顾一下我们以前的代码和相关知识。目前,再次拿起高效编程这本经典之作,对比这个项目的代码,发现一些不足。现在下面慢慢解析:
一、异常退出代码的控制问题
在这次项目中,发现我们在工作中对异常退出的代码控制不是很严。个人认为主要原因有:
1、个人认识不足而导致规范不够。像我这样的新手,往往由于某些编程习惯而忘记了进行相关的控制。
2、这些异常退出的代码很难被测试到,个人认为我们控制不严的很重要的原因。由于没有测试出相关错误所以我们就没有机会对其进行改正。同样,在下次编写相关代码时也很难引起思想上的重视。
下面就我们项目中的代码举一些相关例子:
错误代码:
CQuestionEnumerateDialog* dialog = new (ELeave) CQuestionEnumerateDialog(
aQueSetItem->iQuestionId,aQueSetItem->iEnumSelect);
dialog->SetParent(this);
dialog->LoadQuestionFromXML();
dialog->ExecuteLD(R_PAPER_QUESTION_ENUMERATE_DIALOG);
这段代码没有在可能发生退出的函数之间加入到清除栈中,修改后的代码应如下:
CQuestionEnumerateDialog* dialog = new (ELeave) CQuestionEnumerateDialog(
aQueSetItem->iQuestionId,aQueSetItem->iEnumSelect);
CleanupStack::PushL(dialog);
dialog->SetParent(this);
dialog->LoadQuestionFromXML();
CleanupStack::Pop();
dialog->ExecuteLD(R_PAPER_QUESTION_ENUMERATE_DIALOG);
错误代码:
void CSystemView::DoDeactivate()
{
if (iContainer)
{
iContainer->SaveSettingValuesL();
AppUi()->RemoveFromStack(iContainer);
}
delete iContainer;
iContainer = NULL;
}
由于在视图的DoDeactivate方法中不允许在异常退出,否则会造成程序崩溃。个人认为最直接的方法就是:
void CSystemView::DoDeactivate()
{
if (iContainer)
{
TRAPD(err,iContainer->SaveSettingValuesL());
AppUi()->RemoveFromStack(iContainer);
}
delete iContainer;
iContainer = NULL;
}