EAS系统异常设计
一、 系统中异常现状
1、 C#定义的异常
2、 框架使用异常
1) 通用异常
Exception类型 |
异常描述 |
CustomAppliactionException |
框架自定义异常的基类 |
ClientApplicationException |
框架自定义异常的基类 |
ServerApplicationException |
服务器相关异常(未使用) |
WrongImplementationException |
未知 |
FilterNotFoundException |
过滤器未发现异常(未使用) |
结构
2) SQL异常
Exception类型 |
异常描述 |
给用户的提示 |
ConcurrencySqlException |
并发异常 |
|
DBNotExistsException |
数据库不存在异常 |
|
DuplicateKeySqlException |
重复Key异常 |
|
ForeignKeyViolationSqlException |
外键约束异常 |
|
GenericSqlException |
一般的SQL异常 |
|
ProcedureNotExistsException |
存储过程存在异常 |
|
ReadOnlySqlException |
只读SQL异常 |
|
UniqueValueViolationSqlException |
违反唯一约束异常 |
异常结构:
二、异常设计
1) Exception Handlers (异常处理器)
Wrap handler 包装继续抛出
Replace handler 替换
Logging handler 记录
2) Exception Policies(处理策略 )
Base policy (基本策略):记录继续抛出原异常
Secure policy (安全策略):代替原有异常抛出新异常
Expressive policy :包装异常,抛出新异常
3) 处理机制
DataAccess层:记录并包装,抛出新异常,发生在两层之间
Bussiness层: 记录并继续抛出,本层内部
UI层 :替换显示信息给用户,两层之间
4) 确定异常策略及行为
5) 异常抛出策略
自动抛出:对异常不做处理,函数上层捕获异常
捕获处理,并继续抛出:进行恢复性工作,如果无法恢复,继续抛出
封装异常,抛出新异常:隐藏原异常信息
6) 异常提示:界面层次关键操作提示用户,隐藏程序信息
7) 异常捕获的几个原则
(1) 除非要在异常中添加附加信息,不要捕获。也就是说,如果在此处捕获异常对用户,对程序没有益处,不要捕获。
(2) 如果要重新执行,则捕获异常。同时隐藏原异常中的敏感的信息,格式化异常。
(3) 处理异常通常发生在应用程序边界,如层边界、用户界面边界、服务等。隐藏异常信息可以保护信息不被边界外获取。
(4) 不要在边界之间传输敏感信息,即使边界是可信任的。
(5) 尽可能的定义精确的异常,同事允许采取特定的操作。这需要自定义异常。
(6) 提供给用户的信息必须与异常密切相关,并提供正确的操作提示。同时信息中不应该包含敏感信息,包括栈的调用、服务器名等。
三、常见异常场景
1) Logging An Exception:异常策略的第一步,然后再执行后面的策略。
2) Wrap An Exception:
3) Replace An Exception:发生在记录后,需要记录原异常的GUID
4) Propagating An Exception:
5) Displaying User-Friendly Message:
6) Notify The User:
7) Adding Support Staff:显示的异常跟日志记录的异常的定位
四、EAS系统异常设计
1) 设计目标:
(1) 压缩逻辑显示实现异常,使用最少的代码。
(2) 减轻处理异常的重复代码,使用通用处理。
(3) 保证异常策略发生改变后,程序能同时反应出改变。
(4) 符合微软提供的最佳实践《Exception Management Architecture Guide》。