Symbian开发错误处理框架
Symbian开发异常处理框架Symbian开发异常处理框架目录??1??? 异常处理方式:??? 12??? 异常定义:??? 13???
Symbian开发异常处理框架
Symbian开发异常处理框架目录
?
?
1??? 异常处理方式:??? 1
2??? 异常定义:??? 1
3??? 异常提示信息:??? 2
4??? 系统级异常处理:??? 2
?
1??? 异常处理方式:
提示不做处理(ui/view/db)警告并建议返回MenuPortal(ui/view)警告并返回MenuPortal (ui/view)警告并建议退出系统(ui/view/db)严重警告,必须退出系统(ui/view/db)
2??? 异常定义:#define E_INFO ??? ??? 0x80000000#define E_WARN ??? ??? 0x90000000#define E_RETURN ??? 0xA0000000#define E_ERROR ??? 0xB0000000#define E_EXIT ??? ??? 0xC0000000
以上五种异常处理码定义分对应五种异常处理方式,定义业务级异常宏时以上述相加,产生不同的处理方式,例
#define CMS_SAVE_ERROR 0x1
发生异常时:
TRAP(error, cmsvalueDAO->Save(value)); if (error != KErrNone){CExceptionInfo::Push(_“CMS写入错误!”);User:Leave(ERROR + CMS_SAVE_ERROR);}
?上例为视图向UI抛出的一个用户定义异常,处理方式应该为:“警告并建议退出系统”,将由UI捕获并处理。
3??? 异常提示信息:
异常提示信信除了通用异常与系统级异常可以统一处理外,各业务级异常由产生异常者自行产生或合成,并置入全局可见性的异常信息缓冲区中,由埔获者取出处理。
CExceptionInfo::Push(_“用户信息写入错误!”);
4??? 系统级异常处理:
对于symbian系统所产生的异常,各层应用皆可埔获和处理,但不建议埔获后继续抛出,更合理的做法是将系统异常升级为业务异常或处理,或抛出!
通常情况下,为了保证系统的健壮性,常引入业务级别容错逻辑,只有遇到不可宽容的错误时,才会抛出。
视图抛出的业务异常以及整个系统各层面抛出而未埔获的异常,将统一由UI处理,自定义异常有五种处理方式,这个不用说了,对于系统异常加以判断和友好提示后只能执行默认异常处理,致命错会在给出用户提示后将退出系统
引人异常机制的目的
增强系统健壮性(异常最终捕获处理)提高运行期容错能力(选择性屏蔽下级异常)增强异构环境抗毁能力(数据库与资源访问错误处理)
实施中注意要点:
严格控制DAO层面异常,在VIEW或business层捕获,禁止泄漏至UI最大限度的保证系统的正常运行和数据的完整性视图切换或从选择视图返回时要对携带数据做有效性检查抛出异常注意描述要精确公有函数注意const修饰非本块内初始化的指针变量,使用或删除前做非空判断,删除后的指针一定要置空 Trap操作的系统成本很高,注意尽量少用尽量将错误处理局部化?ViewActivatedL() 不允许涉及iEikonEnv->AlertWin等类似操作最大限度的保存用户数据,不能让异常破坏了数据或事务的完整性数组操作异常建议捕获
CDesCArrayFlat* iDescFlatBusiType = new (ELeave) CDesCArrayFlat(1);CLEAN_PUSH(iDescFlatBusiType);for(int i = 0;i <iArrBusiTypesFix->Count(); i ++){TStringstrBusiType= iArrBusiTypesFix->At(i)->GetBusiness_type_name();iDescFlatBusiType->AppendL(strBusiType);}User::Leave(-11);CLEAN_POP(iDescFlatBusiType);
?
系统异常列表:<E32STD.H>const TInt KErrNotFound=(-1); const TInt KErrGeneral=(-2);const TInt KErrCancel=(-3);const TInt KErrNoMemory=(-4);const TInt KErrNotSupported=(-5);const TInt KErrArgument=(-6);const TInt KErrTotalLossOfPrecision=(-7);const TInt KErrBadHandle=(-8);const TInt KErrOverflow=(-9);const TInt KErrUnderflow=(-10);const TInt KErrAlreadyExists=(-11);const TInt KErrPathNotFound=(-12);const TInt KErrDied=(-13);const TInt KErrInUse=(-14);const TInt KErrServerTerminated=(-15);const TInt KErrServerBusy=(-16);const TInt KErrCompletion=(-17);const TInt KErrNotReady=(-18);const TInt KErrUnknown=(-19);const TInt KErrCorrupt=(-20);const TInt KErrAccessDenied=(-21);const TInt KErrLocked=(-22);const TInt KErrWrite=(-23);const TInt KErrDisMounted=(-24);const TInt KErrEof=(-25);const TInt KErrDiskFull=(-26);const TInt KErrBadDriver=(-27);const TInt KErrBadName=(-28);const TInt KErrCommsLineFail=(-29);const TInt KErrCommsFrame=(-30);const TInt KErrCommsOverrun=(-31);const TInt KErrCommsParity=(-32);const TInt KErrTimedOut=(-33);const TInt KErrCouldNotConnect=(-34);const TInt KErrCouldNotDisconnect=(-35);const TInt KErrDisconnected=(-36);const TInt KErrBadLibraryEntryPoint=(-37);const TInt KErrBadDescriptor=(-38);const TInt KErrAbort=(-39);const TInt KErrTooBig=(-40);const TInt KErrDivideByZero=(-41);const TInt KErrBadPower=(-42);const TInt KErrDirFull=(-43);const TInt KErrHardwareNotAvailable=(-44);
?
?
?
?
?
?
?