异常宣言
1、拒绝歧视。
在一个面向对象系统中,异常毫无疑问也是对象,也应该有其自身的派生体系,有其自身的属性和方法,而绝不应该仅仅是一个类(EGXXError),一个字符串(Message)和两个辅助函数(GXXError和GXXErrorFmt)。强类型的异常有助于上层系统或客户端进行有针对性的截获和相适应的处理,而弱类型或伪强类型的异常导致的后果,要么是仅此一路的字符迷宫(根据字符串来甄别异常),要么是令人费解的报错提示(告诉用户观察者不存在有意义么)。
2、各守其责。
每个模块有自己关心的异常,也有自己不关心的异常。对于你关心的异常,你尽可以截获它,并做适当的处理,处理完你可以选择屏蔽它,也可以重新往外抛。对于你不关心的异常,请留给外层处理,不要搞暗杀。如果某个模块需要处理的异常太多,那么请考虑这个模块职责是否太多。虽然我们极力推荐模块要处理自己关心的异常,但事实证明,很多时候自己都不知道应关心哪些异常,这时候我建议你选择保守一点,知道几个就处理几个,不知道的就不要管。另外,如果是在与界面无关的公共模块,注意不要贸然越权跟用户打交道(报错提示等),因为那不是你的事,做了你不应做的事就意味着你变得专制,很难再被复用了!
3、体贴原则。
你确实需要向用户报告,那么也请尽量体贴注意用户。首先,你的提示是否确有必要,你是否在让用户在重复做无聊的事情;其次,提示信息是否描述准确、完备,用户会不会因为看不懂而拨打服务热线,当然,礼貌、温情而有指导性的信息肯定更好。但即使是好的提示信息也请尽量选择在合适的地方以合适的方式出现,而不总是冒失地弹出对话框,打断用户的思考和操作。对于国际用户,在提示前你还得选择合适的语言。总之,把自己作为用户吧。
3、国际公约。
强类型的异常并不是任何时候都是有效的,因为它可能无法跨越系统边界,比如COM的异常,比如WebService的异常,但你仍然需要流化足够多的信息以帮助使用者判断异常的上下文,它可能是一个异常代号加一份帮助文档,也可能是一段包含必要信息的XML,这就是异常的国际公约。
4、最后防线。
应该尽量避免用户直接面对无人处理的异常,因为用户不会帮你处理,更不要奢望操作系统能为你做什么,引狼入室的后果是毁掉整个应用程序。因此请在你的应用程序最外层处理掉所有的异常,如果你觉得异常是可以接受的,那么请你提示用户或记入日志,然后屏蔽它;如果你觉得应用程序已病入膏肓,那么也请你提示用户并记入日志,并自动关掉程序,避免不好的用户体验。
浙公网安备 33010602011771号