您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > [设计文档]系统异常设计
数银在线技术开发部文档系统异常设计规范版本V1.0PoweredBy王吉晨MSccertificatedByBritishComputerSocietySeniorJava&JavaRTSDeveloperFormerNASAScientistSystemExceptionDesignwangjc@6677bank.com©2011数银在线Private&ConfidentialByJichenWang系统异常设计规范1简介本文档介绍了系统异常设计的规范,所有数银在线的系统异常设计今后均按照本文制定的规范实施。异常分为系统级和业务级,系统级异常面向系统维护和开发人员,业务级的异常面向系统的使用者,即业务人员,一般要根据具体系统的业务规则去定义。本文对系统级的异常做了定义,对业务级的异常做了实现模型的设计。1.1背景当前所有数银系统中,对异常的定义及提示都是各成一套体系,对异常的捕捉及处理没有一个统一的规范。尤其是异常的命名,提示信息,抛出及处理的位置都非常混乱,导致系统程序在出错后的维护非常不便,难以快速定位至出错的根源。业务级的异常对系统使用者的提示也不够友好和专业。1.2目标建立异常的定义,处理,提示机制的规范,使异常的处理能够统一管理,异常的提示信息可以通过配置实现,而非写死在系统代码中。异常类型的判断均在系统的服务层进行,最终将结果返回给展现层,展现层通过事先配置好的异常代码和提示消息的映射关系来显示对应的提示消息。1.3定义和术语系统级异常:系统运行时的异常,如数据库连接失败,程序中的空指针异常,服务页面无法找到等,通常无需系统使用者关注的问题,即因为程序出错而导致的问题。业务级异常:和业务逻辑相关的异常,即用户的操作导致了某个业务流程无法进行,造成业务数据错误时发生的异常,和系统本身的运行没有关系。1.4参考文档无SystemExceptionDesignwangjc@6677bank.com©2011数银在线Private&ConfidentialByJichenWang2异常设计异常分为系统级和业务级,本节将详细说明两种异常的定义,在系统程序中的实现,给出了异常抛出,捕获和处理的流程机制。2.1系统级异常系统级异常指的是系统程序本身出现的错误,产生的异常,这类异常按级别也可以分为三个等级,如表2-1所示,列出了各种系统级异常的定义。系统异常级别异常定义异常实例程序级因程序代码编写错误而产生的,而此类异常一般在系统上线前的测试可以检查出来空指针异常框架级系统程序代码调用一些第三方类库时出现的错误,比如框架本身的错误线程数量耗尽底层系统操作系统相关的底层错误,一般是系统底层出现了错误,如网络中断,和程序本身无关。Brokenpipe,网络中断表2-1系统级异常定义系统级的异常在我们现有系统的分层结构中,会在各个层中出现,如图2-1所示各层异常出现的位置。对系统级的异常,系统将提供一个统一的提示信息(如提示用户系统服务不可用),并将详细地记录出错的程序堆栈信息,供开发人员进行错误修复。图2-1各层的系统异常数据持久层数据库业务逻辑层展现层数据库连接异常事务异常框架异常SystemExceptionDesignwangjc@6677bank.com©2011数银在线Private&ConfidentialByJichenWang以业务逻辑层为界,所有在业务逻辑层内和业务层之后所发生的系统异常,均抛至业务逻辑层进行处理(包括框架本身的异常),最终将结果传递给展现层进行错误消息的提示。2.2业务级异常业务级异常的定义和处理必须结合实际的业务规则进行定义,与系统程序本身以及底层系统无关,即在系统运行时,系统程序和底层程序没有出错,该错误是面向业务层面的,为业务出错。Java异常分为两大类:checked异常和unChecked异常。所有继承java.lang.Exception的异常都属于checked异常。所有继承java.lang.RuntimeException的异常都属于unChecked异常。业务级的异常一般可以定义为unChecked异常,即在运行时抛出的,根据业务层执行的结果,对照业务规则来抛出业务的异常,然后通过一个统一的业务异常处理来检查该业务异常的类型,最终提示给用户面向业务的错误信息。图2-2描述了业务级异常定义,处理的模型。图2-2业务级异常模型通过定义一个BusinessException集成RuntimeException来抽象所有的业务异常,让所有的业务层的服务接口中的方法,均都抛出业务异常,最终由调用该业务接口的类去捕获并处理该异常(展现层调用则提示错误消息,服务层调用则进行相关业务处理)。举例说明,如在图中定义的用户不存在异常(UserNotExistException)可用于用户登录时,查找对比用户信息,发现用户信息不正确则抛出该异常。在调用该服务的展现层中捕获该异常并根据该异常的名称返回提示信息。2.3异常模型设计Java异常处理通过五个关键字来实现,try,catch,throw,throws,finally。具体的异常处理结构由try….catch….finally块来实现。try块存放可能出现异常的java语句,catch用来捕获发RuntimeExceptionBusinessExceptionUserNotExistExceptionAppAlreadyExistExceptionExcepitonHandlerSystemExceptionDesignwangjc@6677bank.com©2011数银在线Private&ConfidentialByJichenWang生的异常,并对异常进行处理。Finally块用来清除程序中未释放的资源。不管理try块的代码如何返回,finally块都总是被执行。Java给错误进行了统一的分类,通过扩展Exception类或其子类来实现。从而避免了相同的错误可能在不同的方法中具有不同的错误信息。在不同的方法中出现相同的错误时,只需要throw相同的异常对象即可。通过异常类,可以给异常更为详细,对用户更为有用的错误信息。以便于用户进行跟踪和调试程序。把正确的返回结果与错误信息分离。降低了程序的复杂度。调用者无需要对返回结果进行更多的了解。强制调用者进行异常处理,提高程序的质量。当一个方法声明需要抛出一个异常时,那么调用者必须使用try….catch块对异常进行处理。当然调用者也可以让异常继续往上一层抛出。根据Java的这中特性,我们设计了一个异常抛出及处理的模型,如图2-3所示,今后所有系统开发中的异常设计均按照该模型的规范进行。总的原则是所有业务级的异常均使用RuntimeException,即所有业务接口均抛出该异常,所有系统级的异常在业务层中全部处理掉并重新封装为一个统一的业务异常(可提示系统错误,请联系开发人员),并将系统错误记录在后台日志,无需展现给系统使用者SystemExceptionDesignwangjc@6677bank.com©2011数银在线Private&ConfidentialByJichenWang3规范说明如果一个异常是致命的,不可恢复的。或者调用者去捕获它没有任何益处,使用unChecked异常。如果一个异常是可以恢复的,可以被调用者正确处理的,使用checked异常。在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常。由调用者自己去决定是否捕获unChecked异常到底什么时候使用checked异常,什么时候使用unChecked异常?并没有一个绝对的标准。当所有调用者必须处理这个异常,可以让调用者进行重试操作;或者该异常相当于该方法的第二个返回值。使用checked异常。这个异常仅是少数比较高级的调用者才能处理,一般的调用者不能正确的处理。使unchecked异常。有能力处理的调用者可以进行高级处理,一般调用者干脆就不处理。这个异常是一个非常严重的错误,如数据库连接错误,文件无法打开等。或者这些异常是与外部环境相关的。不是重试可以解决的,使用unchecked异常。因为这种异常一旦出现,调用者根本无法处理。如果不能确定时,使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。
本文标题:[设计文档]系统异常设计
链接地址:https://www.777doc.com/doc-5514175 .html