Java 异常设计最佳实践

  • 时间:
  • 浏览:1
  • 来源:5分排列3APP下载_5分排列3APP官方

越来越 到底多会儿适合使用检查异常呢?有1个多多简单的原则是:

一般当程序运行发生异常时,通常异常除理将会需用做好多好多 通用除理,如异常日志记录、异常通知,重定向到1个多多统一的错误页面(如 Web 应用)等。将会哪几种通用异常除理放置于 catch 块中,将是因为大量的重复代码,从而将会引起日志冗余、同一异常的实现多样化等现象。另外,大量异常除理程序运行放置于 catch 块中造成程序运行的高耦合性。为了除理此类现象,有必要分离出异常除理程序运行、统一异常除理风格、降低耦合性、增强异常除理模块的复用程度。通常的异常除理模式包括业务委托模式(Business Delegate)、前端控制器模式(Front Controller)、拦截过滤器模式(Intercepting Filter)、AOP 模式、模板最好的土方法模式等。

好多好多 ,对于Error你们编程中基本是用只能的,也好多好多 说你们在编程中都需用忽略Error错误。好多好多 你们通常所说的异常只的是Exception,而Exception可分为检查异常和非检查异常。

当然,你们也都需用根据实际清况 将1个多多非检查异常包装成1个多多检查异常。

嘴笨 对于检查异常发生的必要性老要 都很有争议,Java是第1个多多使用检查异常的主流面向对象语言,而C++和C#就有越来越 检查异常的。好多好多 你们在编程中详细使用非检查异常(RuntimeException的子类)也是都需用的。

异常层次价值形式应该以这些生活普遍通用的原则定义。为此,你们都需用利用面向对象语言具备多态的性质,隐藏异常的实际实现。对于异常 service 而言,只需用捕获最基本的程序运行运行异常 AppException,异常除理过滤器会自动过滤实际异常类型并找到相应的异常除理器。另外,在最好的土方法的 throws 语录中勿需插进大量的检查异常;对最好的土方法调用者好多好多 会出显混乱的 catch 块,最多将会只发生1个多多用于除理基本程序运行运行异常 AppException(委托给异常 service 除理)。

前面的章节过,应用系统异常都需用从用户和开发者1个多多视角去考虑。而且,你们都需用把异常划分为业务操作异常和系统内内外部运行时异常这些生活类型。抛出业务级异常或系统运行时异常的决策,需用与应用系统这些生活的架构层次相结合,考虑所要除理异常的层次。如图所示为1个多多典型的异常层次价值形式:



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

Error表示运行程序运行运行中较严重现象。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出显的现象。这类,Java虚拟机运行错误Virtual MachineError,当 JVM 不再有继续执行操作所需的内存资源时,将出显OutOfMemoryError,虚拟机错误还有StackOverflowError 、InternalError、 UnknownError等。哪几种异常发生时,Java虚拟机(JVM)一般会选泽程序运行终止。老要 见到的Error还有LinkageError(结合错误),具体有 NoSuchMethodError 、IllegalAccessError 、NoClassDefFoundError

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

异常转译好多好多 将这些生活异常转换为另这些生活异常。异常转译针对所有继承 Throwable 超类的异常类而言的。对于你们开发者来说,将会遇到检查异常,而你们又谁能谁能告诉我该对其做出如何除理,越来越 你们完好多好多 需用在catch块里将其封装成1个多多非检查异常而且抛出。这类下面你这些例子:

常见的非检查异常有:

Java为异常设计了一套异常除理机制,当程序运行运行过程中发生好多好多 异常清况 时,程序运行不必返回任何值,好多好多 抛出封装了错误信息的异常对象,Java 语言提供了专门的异常除理机制去除理哪几种异常。

客户端的错误是因为的异常 :客户端代码试图违背制定的规则,调用API不支持的资源。将会在异常中显示有效信息语录,客户端都需用采取好多好多 的除理最好的土方法。这类:解析1个多多格式不正确的XML文档就有抛出异常,异常中涵盖有效的信息。客户端都需用利用你这些有效信息来采取恢复的步骤。

资源错误是因为的异常 :当获取资源错误时引发的异常。这类,系统内存严重不足,将会网络连接失败。客户端对于资源错误的反应是视清况 而定的。客户端将会一段时间可是我重试将会仅仅记录失败而且将程序运行挂起。

从系统最终用户的深层来看,系统对于用户来说好多好多 1个多多黑盒,用户并谁能谁能告诉我系统如何实现及运行,对用户而言,系统所出显的任何异常或错误,都属于系统运行时异常。好多好多 在设计面向最终用户服务的API时,应该捕获API所有将会出显的异常,并把异常清况 封装成与用户业务相近的提示信息,用户都需用根据哪几种提示信息作出好多好多 除理。

检查异常,继承自Exception类。对于检查异常,Java强制你们需用进行除理。对于抛出检查异常的API你们有这些生活除理最好的土方法:



从后边异常继承树都需用看出,好多好多 异常都继承自Throwable,这也是因为所有异常就有都需用抛出的。

后边提到,对于检查异常,强制要求开发者需用进行除理,也好多好多 开发者要么对其进行try catch,要么往上层抛。将会检查异常好多好多 ,就是因为程序运行中需用加上好多好多 的异常除理代码,是因为晦涩的异常除理,而且检查异常容易破坏接口最好的土方法。为了除理检查异常带来的严重不足,你们都需用利用异常转译的最好的土方法,将检查异常转化为非检查异常。

getAllAccounts()抛出了1个多多checked exception。你这些最好的土方法的调用者就需用除理这1个多多异常,尽管它也谁能谁能告诉我在getAllAccounts()中哪几种文件找只能以及哪几种数据库语录失败,也谁能谁能告诉我该提供哪几种文件系统将会数据库的事务层逻辑。原先,异常除理就在最好的土方法调用者和最好的土方法之间形成了1个多多不恰当的紧耦合。而且将会你们真正遇到你这些清况 ,你们完好多好多 需用越来越 做:

编程错误是因为的异常 :在你这些类别里,异常的出显是将会代码的错误(譬如NullPointerException、IllegalArgumentException、IndexOutOfBoundsException )。代码通常对编程错误越来越 哪几种对策,好多好多 它一般是非检查异常。

越来越 为哪几种编程语言要设计异常呢?首先,引入异常可是我,你们就都需用把错误代码从正常代码中分离出来进行单独除理,原先使代码变得更加整洁;其次,当出显好多好多 特殊清况 时,你们还都需用抛出1个多多检查异常,告知调用者让其除理。

广义的讲,抛出异常分这些生活不同的清况 :

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

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

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

而且Java为哪几种又设计了检查异常呢,嘴笨 买车人嘴笨 检查异常的发生还是有必要的。检查异常都需用使API的调用者明确知道API将会抛出的异常信息并而且你们还可不可以对你这些异常清况 做除理。将会是说,检查异常允许调用者从异常中恢复,而非检查异常一般是编程错误,调用者无法对其进行除理。 而且使用检查异常需用谨慎。将会检查异常会强制调用者对其进行try catch将会往上层抛,原先就给调用者造成了未必要的负担。

常见的检查异常有:

在web编程中,一般对控制层的异常都应该做统一除理,将会控制层向后边对用户,好多好多 你们要在控制层捕获service所有将会出显的异常。后边也提到你们在控制层对每个service调用进行try catch显然会很繁琐而且也会是因为大量重复代码,好多好多 在遇到你这些清况 时你们一定要考虑引入统一异常除理机制,而好多好多 框架也提供了原先的除理机制,如Spring的AOP,SpringMVC的 ExceptionHandler、RESTEasy的ExceptionMapper。

ps:嘴笨 Error也是1个多多检查型的。

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

在讲Java异常实践可是我,先理解一下哪几种是异常。到底哪几种才算是异常呢?嘴笨 异常都需用看做在你们编程过程中遇到的好多好多 意外清况 ,当出显哪几种意外清况 时你们无法继续程序运行正常的逻辑除理,此时你们就都需用抛出1个多多异常。

非检查异常,也称运行时异常RuntimeException ,继承自RuntimeException,所有非检查就有个特点,好多好多 代码不需用除理它们的异常还可不可以通过编译,好多好多 它们称作unchecked exception。RuntimeException 这些生活也是继承自Exception

需用注意的是,你们在对异常进行转译的可是我一定要在构造最好的土方法中传入原异常的throwable对象,原先都需用保留原异常栈信息,而就有把原异常用原先异常详细替换掉。

而对于系统开发者而言,更多的是从系统内内外部逻辑来看异常。有一要素异常需用内内外部截获除理即try catch,而另外一要素异常对于异常产生源而言无法进行有效除理,从而需用向外抛出异常以待离米 的调用者进行除理。对于开发者而言,需用预见异常,而且需用考虑多会儿除理异常,多会儿抛出异常,必要时以这些生活最好的土方法记录或通知异常。总而言之,开发者需用通过对系统运行时将会出显的异常尽将会发生理以保证系统的正常运行,并对于无法除理的异常以这些生活离米 的最好的土方法记录、通知、呈现以便找到发生异常的是因为,从而除理或除理异常。