Java 异常设计最佳实践

  • 时间:
  • 浏览:1
  • 来源:大发彩神UU快三_大发神彩UU快三官方

那末为哪些编程语言要设计异常呢?首先,引入异常过后 ,大伙就还时需把错误代码从正常代码中分离出来进行单独防止,过后 使代码变得更加整洁;其次,当总出 一点特殊情况汇报时,大伙还还时需抛出2个多检查异常,告知调用者让其防止。

因此Java为哪些又设计了检查异常呢,着实所有人着实检查异常的存在还是有必要的。检查异常还时需使API的调用者明确知道API原应抛出的异常信息并让大伙也能对你你什儿 异常情况汇报做防止。原应是说,检查异常允许调用者从异常中恢复,而非检查异常一般是编程错误,调用者无法对其进行防止。 因此使用检查异常时需谨慎。原应检查异常会强制调用者对其进行try catch原应往上层抛,过后 就给调用者造成了并并不的负担。

异常转译可是将你什儿 异常转换为另你什儿 异常。异常转译针对所有继承 Throwable 超类的异常类而言的。对于大伙开发者来说,原应遇到检查异常,而大伙又谁能谁能告诉我该对其做出怎么防止,那末大伙删剪还时需在catch块里将其封装成2个多非检查异常因此抛出。类似于下面你你什儿 例子:

Error表示运行应用应用程序中较严重大问題。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)总出 的大问題。类似于,Java虚拟机运行错误Virtual MachineError,当 JVM 不再有继续执行操作所需的内存资源时,将总出 OutOfMemoryError,虚拟机错误还有StackOverflowError 、InternalError、 UnknownError等。哪些异常存在时,Java虚拟机(JVM)一般会选折 应用程序终止。总是见到的Error还有LinkageError(结合错误),具体有 NoSuchMethodError 、IllegalAccessError 、NoClassDefFoundError

资源错误原应的异常 :当获取资源错误时引发的异常。类似于,系统内存不足,原应网络连接失败。客户端对于资源错误的反应是视情况汇报而定的。客户端原应一段时间过后 重试原应仅仅记录失败因此将应用程序挂起。

具体来说,广义的异常还时需分为ErrorException两大类。

里边提到,对于检查异常,强制要求开发者时需进行防止,也可是开发者要么对其进行try catch,要么往上层抛。原应检查异常可是,可原应应用程序中时需加进去去可是的异常防止代码,原应晦涩的异常防止,因此检查异常容易破坏接口方法。为了防止检查异常带来的不足,大伙还时需利用异常转译的方法,将检查异常转化为非检查异常。

前面的章节过,应用系统异常还时需从用户和开发者2个多视角去考虑。因此,大伙还时需把异常划分为业务操作异常和系统内部运行时异常你什儿 类型。抛出业务级异常或系统运行时异常的决策,时需与应用系统你什儿 的架构层次相结合,考虑所要防止异常的层次。如图所示为2个多典型的异常层次特性:



其中,BussinessException 属于基本业务操作异常,所有业务操作异常都继承于该类。类似于,通常 UI 层或 Web 层是由系统最终用户执行业务操作驱动,因此最好抛出业务类异常。ServiceException 一般属于里边服务层异常,该层操作引起的异常一般包装成基本 ServiceException。DAOException 属于数据访问相关的基本异常。

着实对于检查异常存在的必要性总是都很有争议,Java是第2个多使用检查异常的主流面向对象语言,而C++和C#都在那末检查异常的。可是大伙在编程中删剪使用非检查异常(RuntimeException的子类)也是还时需的。

对于多层系统,每一层都在该层的基本异常。在层与层之间的信息传递与方法调用过后 ,一旦在某层存在异常,传递到上一层的过后 ,一般包装成该层异常,直至与用户最接近的 UI 层,从而转化成用户友好的错误信息。

当然,大伙也还时需根据实际情况汇报将2个多非检查异常包装成2个多检查异常。

Java为异常设计了一套异常防止机制,当应用应用程序过程中存在一点异常情况汇报时,应用程序不想返回任何值,可是抛出封装了错误信息的异常对象,Java 语言提供了专门的异常防止机制去防止哪些异常。

常见的非检查异常有:



从里边异常继承树还时需看出,可是异常都继承自Throwable,这也原应所有异常都在还时需抛出的。

检查异常,继承自Exception类。对于检查异常,Java强制大伙时需进行防止。对于抛出检查异常的API大伙有你什儿 防止方法:

在web编程中,一般对控制层的异常都应该做统一防止,原应控制层向里边对用户,可是大伙要在控制层捕获service所有原应总出 的异常。里边也提到大伙在控制层对每个service调用进行try catch显然会很繁琐因此也会原应一定量重复代码,可是在遇到你你什儿 情况汇报时大伙一定要考虑引入统一异常防止机制,而可是框架也提供了过后 的防止机制,如Spring的AOP,SpringMVC的 ExceptionHandler、RESTEasy的ExceptionMapper。

时需注意的是,大伙在对异常进行转译的过后 一定要在构造方法中传入原异常的throwable对象,过后 还时需保留原异常栈信息,而都在把原异常用过后 异常删剪替换掉。

ps:着实Error也是2个多检查型的。

非检查异常,也称运行时异常RuntimeException ,继承自RuntimeException,所有非检查都在个特点,可是代码不时需防止它们的异常也能通过编译,可是它们称作unchecked exception。RuntimeException 你什儿 也是继承自Exception

广义的讲,抛出异常分你什儿 不同的情况汇报:

而对于系统开发者而言,更多的是从系统内部逻辑来看异常。有一要素异常时需内部截获防止即try catch,而另外一要素异常对于异常产生源而言无法进行有效防止,从而时需向外抛出异常以待至少的调用者进行防止。对于开发者而言,时需预见异常,因此时需考虑何时防止异常,何时抛出异常,必要时以你什儿 方法记录或通知异常。总而言之,开发者时需通过对系统运行时原应总出 的异常尽原应存在理以保证系统的正常运行,并对于无法防止的异常以你什儿 至少的方法记录、通知、呈现以便找到存在异常的原应,从而防止或防止异常。

一般当应用程序存在异常时,通常异常防止原应时需做一点通用防止,如异常日志记录、异常通知,重定向到2个多统一的错误页面(如 Web 应用)等。原应哪些通用异常防止放置于 catch 块中,将原应一定量的重复代码,从可原应引起日志冗余、同一异常的实现复杂性等大问題。另外,一定量异常防止应用程序放置于 catch 块中造成应用程序的高耦合性。为了防止此类大问題,有必要分离出异常防止应用程序、统一异常防止风格、降低耦合性、增强异常防止模块的复用程度。通常的异常防止模式包括业务委托模式(Business Delegate)、前端控制器模式(Front Controller)、拦截过滤器模式(Intercepting Filter)、AOP 模式、模板方法模式等。

在讲Java异常实践过后 ,先理解一下哪些是异常。到底哪些才是是否是是异常呢?着实异常还时需看做在大伙编程过程中遇到的一点意外情况汇报,当总出 哪些意外情况汇报时大伙无法继续应用程序正常的逻辑防止,此时大伙就还时需抛出2个多异常。

可是,对于Error大伙编程中基本是用也能了的,也可是说大伙在编程中还时需忽略Error错误。可是大伙通常所说的异常只的是Exception,而Exception可分为检查异常和非检查异常。

从系统最终用户的层厚来看,系统对于用户来说可是2个多黑盒,用户并谁能谁能告诉我系统怎么实现及运行,对用户而言,系统所总出 的任何异常或错误,都属于系统运行时异常。可是在设计面向最终用户服务的API时,应该捕获API所有原应总出 的异常,并把异常情况汇报封装成与用户业务相近的提示信息,用户还时需根据哪些提示信息作出一点防止。

异常层次特性应该以你什儿 普遍通用的原则定义。为此,大伙还时需利用面向对象语言具备多态的性质,隐藏异常的实际实现。对于异常 service 而言,只时需捕获最基本的应用应用程序异常 AppException,异常防止过滤器会自动过滤实际异常类型并找到相应的异常防止器。另外,在方法的 throws 语录中勿需放进一定量的检查异常;对方法调用者可是会总出 混乱的 catch 块,最多原应只存在2个多用于防止基本应用应用程序异常 AppException(委托给异常 service 防止)。

对于Spring MVC框架统一异常防止机制请参考:Spring MVC 中的异常防止 (handling exceptions)

对于Restful框架的统一异常防止机制请参考: RESTEasy中的通用异常防止ExceptionMapper

编程错误原应的异常 :在你你什儿 类别里,异常的总出 是原应代码的错误(譬如NullPointerException、IllegalArgumentException、IndexOutOfBoundsException )。代码通常对编程错误没哪些对策,可是它一般是非检查异常。

常见的检查异常有:

那末到底何时适合使用检查异常呢?2个多多简单的原则是:

通常大伙所说的异常指的都在Exception的子类,它们具体还时需分为两大类在Java,Exception的子类和RuntimeException的子类,它们分别对应着检查异常和非检查异常。

客户端的错误原应的异常 :客户端代码试图违背制定的规则,调用API不支持的资源。原应在异常中显示有效信息语录,客户端还时需采取一点的防止方法。类似于:解析2个多格式不正确的XML文档都在抛出异常,异常中包蕴藏效的信息。客户端还时需利用你你什儿 有效信息来采取恢复的步骤。

getAllAccounts()抛出了2个多checked exception。你你什儿 方法的调用者就时需防止你什儿 个多异常,尽管它也谁能谁能告诉我在getAllAccounts()中哪些文件找也能了以及哪些数据库语录失败,也谁能谁能告诉我该提供哪些文件系统原应数据库的事务层逻辑。过后 ,异常防止就在方法调用者和方法之间形成了2个多不恰当的紧耦合。因此原应大伙真正遇到你你什儿 情况汇报,大伙删剪还时需那末做: