Java 异常设计最佳实践

  • 时间:
  • 浏览:8
  • 来源:uu快3app娱乐_uu快3辅助_官方网址

上端提到,对于检查异常,强制要求开发者都要进行防止,也之后开发者要么对其进行try catch,要么往上层抛。之后检查异常好多好多 ,就意味系统任务管理器中都要加在好多好多 的异常防止代码,意味晦涩的异常防止,有之后检查异常容易破坏接口土办法 。为了防止检查异常带来的不够,村里人 村里人 都要利用异常转译的土办法 ,将检查异常转化为非检查异常。

非检查异常,也称运行时异常RuntimeException ,继承自RuntimeException,所有非检查完会 个特点,之后代码不都要防止它们的异常可不能否 通过编译,好多好多 它们称作unchecked exception。RuntimeException 本身也是继承自Exception

觉得 对于检查异常居于的必要性老要 都很有争议,Java是第一个 使用检查异常的主流面向对象语言,而C++和C#完会 这麼检查异常的。好多好多 村里人 村里人 在编程中完整性使用非检查异常(RuntimeException的子类)也是都要的。

一般当系统任务管理器居于异常时,通常异常防止之后都要做好多好多 通用防止,如异常日志记录、异常通知,重定向到一个 统一的错误页面(如 Web 应用)等。之后哪此通用异常防止放置于 catch 块中,将意味小量的重复代码,从而之后引起日志冗余、同一异常的实现僵化 等什么的什么的问题。另外,小量异常防止系统任务管理器放置于 catch 块中造成系统任务管理器的高耦合性。为了防止此类什么的什么的问题,有必要分离出异常防止系统任务管理器、统一异常防止风格、降低耦合性、增强异常防止模块的复用程度。通常的异常防止模式包括业务委托模式(Business Delegate)、前端控制器模式(Front Controller)、拦截过滤器模式(Intercepting Filter)、AOP 模式、模板土办法 模式等。

前面的章节过,应用系统异常都要从用户和开发者一个 视角去考虑。有之后,村里人 村里人 都要把异常划分为业务操作异常和系统内控 运行时异常本身类型。抛出业务级异常或系统运行时异常的决策,都要与应用系统本身的架构层次相结合,考虑所要防止异常的层次。如图所示为一个 典型的异常层次价值形式:



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

Error表示运行应用系统任务管理器中较严重什么的什么的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的什么的什么的问题。类似于,Java虚拟机运行错误Virtual MachineError,当 JVM 不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError,虚拟机错误还有StackOverflowError 、InternalError、 UnknownError等。哪此异常居于时,Java虚拟机(JVM)一般会选者系统任务管理器终止。老要 见到的Error还有LinkageError(结合错误),具体有 NoSuchMethodError 、IllegalAccessError 、NoClassDefFoundError

getAllAccounts()抛出了一个 checked exception。你这种土办法 的调用者就都要防止你这种一个 异常,尽管它也告诉我在getAllAccounts()中哪此文件找只有以及哪此数据库句子失败,也告诉我该提供哪此文件系统之后数据库的事务层逻辑。另一个 ,异常防止就在土办法 调用者和土办法 之间形成了一个 不恰当的紧耦合。有之后之后村里人 村里人 真正遇到你这种情况,村里人 村里人 完整性都要这麼做:

在web编程中,一般对控制层的异常都应该做统一防止,之后控制层向上端对用户,好多好多 村里人 村里人 要在控制层捕获service所有之后出现的异常。上端也提到村里人 村里人 在控制层对每个service调用进行try catch显然会很繁琐有之后也会意味小量重复代码,好多好多 在遇到你这种情况时村里人 村里人 一定要考虑引入统一异常防止机制,而好多好多 框架也提供了另一个 的防止机制,如Spring的AOP,SpringMVC的 ExceptionHandler、RESTEasy的ExceptionMapper。

好多好多 ,对于Error村里人 村里人 编程中基本是用只有的,也之后说村里人 村里人 在编程中都要忽略Error错误。好多好多 村里人 村里人 通常所说的异常只的是Exception,而Exception可分为检查异常和非检查异常。

异常层次价值形式应该以本身普遍通用的原则定义。为此,村里人 村里人 都要利用面向对象语言具备多态的性质,隐藏异常的实际实现。对于异常 service 而言,只都要捕获最基本的应用系统任务管理器异常 AppException,异常防止过滤器会自动过滤实际异常类型并找到相应的异常防止器。另外,在土办法 的 throws 句子中勿需倒入小量的检查异常;对土办法 调用者之后会出现混乱的 catch 块,最多之后只居于一个 用于防止基本应用系统任务管理器异常 AppException(委托给异常 service 防止)。

资源错误意味的异常 :当获取资源错误时引发的异常。类似于,系统内存不够,之后网络连接失败。客户端对于资源错误的反应是视情况而定的。客户端之后一段时间之后重试之后仅仅记录失败有之后将系统任务管理器挂起。

异常转译之后将本身异常转换为另本身异常。异常转译针对所有继承 Throwable 超类的异常类而言的。对于村里人 村里人 开发者来说,之后遇到检查异常,而村里人 村里人 又告诉我该对其做出咋样防止,这麼村里人 村里人 完整性都要在catch块里将其封装成一个 非检查异常有之后抛出。类似于下面你这种例子:

检查异常,继承自Exception类。对于检查异常,Java强制村里人 村里人 都要进行防止。对于抛出检查异常的API村里人 村里人 有本身防止土办法 :



从上端异常继承树都要看出,好多好多 异常都继承自Throwable,这也意味所有异常完会 都要抛出的。

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

都要注意的是,村里人 村里人 在对异常进行转译的之后一定要在构造土办法 中传入原异常的throwable对象,另一个 都要保留原异常栈信息,而完会 把原异常用另一个 异常完整性替换掉。

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

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

有之后Java为哪此又设计了检查异常呢,觉得 人个觉得 检查异常的居于还是有必要的。检查异常都要使API的调用者明确知道API之后抛出的异常信息并村里人 村里人 可不能否 对你这种异常情况做防止。之后是说,检查异常允许调用者从异常中恢复,而非检查异常一般是编程错误,调用者无法对其进行防止。 有之后使用检查异常都要谨慎。之后检查异常会强制调用者对其进行try catch之后往上层抛,另一个 就给调用者造成了不需要说要的负担。

ps:觉得 Error也是一个 检查型的。

这麼到底多会儿适合使用检查异常呢?三个小 简单的原则是:

编程错误意味的异常 :在你这种类别里,异常的出现是之后代码的错误(譬如NullPointerException、IllegalArgumentException、IndexOutOfBoundsException )。代码通常对编程错误这麼哪此对策,好多好多 它一般是非检查异常。

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

这麼为哪此编程语言要设计异常呢?首先,引入异常之后,村里人 村里人 就都要把错误代码从正常代码中分离出来进行单独防止,另一个 使代码变得更加整洁;其次,当出现好多好多 特殊情况时,村里人 村里人 都要抛出一个 检查异常,告知调用者让其防止。

当然,村里人 村里人 也都要根据实际情况将一个 非检查异常包装成一个 检查异常。

而对于系统开发者而言,更多的是从系统内控 逻辑来看异常。有一要素异常都要内控 截获防止即try catch,而另外一要素异常对于异常产生源而言无法进行有效防止,从而都要向外抛出异常以待相当于的调用者进行防止。对于开发者而言,都要预见异常,有之后都要考虑多会儿防止异常,多会儿抛出异常,必要时以本身土办法 记录或通知异常。总而言之,开发者都要通过对系统运行时之后出现的异常尽之后居于理以保证系统的正常运行,并对于无法防止的异常以本身相当于的土办法 记录、通知、呈现以便找到居于异常的意味,从而防止或防止异常。

在讲Java异常实践之后,先理解一下哪此是异常。到底哪此才算不算 异常呢?觉得 异常都要看做在村里人 村里人 编程过程中遇到的好多好多 意外情况,当出现哪此意外情况时村里人 村里人 无法继续系统任务管理器正常的逻辑防止,此时村里人 村里人 就都要抛出一个 异常。

客户端的错误意味的异常 :客户端代码试图违背制定的规则,调用API不支持的资源。之后在异常中显示有效信息句子,客户端都要采取好多好多 的防止土办法 。类似于:解析一个 格式不正确的XML文档完会 抛出异常,异常含有有有效的信息。客户端都要利用你这种有效信息来采取恢复的步骤。

Java为异常设计了一套异常防止机制,当系统任务管理器运行过程中居于好多好多 异常情况时,系统任务管理器不需要返回任何值,之后抛出封装了错误信息的异常对象,Java 语言提供了专门的异常防止机制去防止哪此异常。

常见的非检查异常有:

通常村里人 村里人 所说的异常指的完会 Exception的子类,它们具体都要分为两大类在Java,Exception的子类和RuntimeException的子类,它们分别对应着检查异常和非检查异常。

广义的讲,抛出异常分本身不同的情况:

从系统最终用户的层厚来看,系统对于用户来说之后一个 黑盒,用户并告诉我系统咋样实现及运行,对用户而言,系统所出现的任何异常或错误,都属于系统运行时异常。好多好多 在设计面向最终用户服务的API时,应该捕获API所有之后出现的异常,并把异常情况封装成与用户业务相近的提示信息,用户都要根据哪此提示信息作出好多好多 防止。

常见的检查异常有:

猜你喜欢

三星w2018组装机怎么样?能不能买?

 我来答为你推荐:可选中三个 多多或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。你对你你这种回答的评价是?本回答被提问者采纳展开完整篇 展开完整篇

2020-03-22

2018上半年电信三大运营商净利多少?

财报显示,上四天,中国移动净利润656.41亿元,同比增长4.7%;中国联通净利润25.8亿元,同比增长231.8%;中国电信净利润135.7亿元,同比增长8.1%。 经计算,

2020-03-22

为何风口过去之后,百果园反而要在无人零售上发力?

一次未果的试水百果园办公室无人货架尝试为啥悄然停止?這個次的无人零售,和上一次哪些不同?对百果园的整体战略来说,这次的无人零售尝试,又扮演着如保的角色?针对以上难题,百果园无人

2020-03-22

[LeetCode] Number of 1 Bits 位1的个数

本文转自博客园Grandyang的博客,原文链接:[LeetCode]Numberof1Bits位1的个数,如需转载请自行联系原博主。Forexample,the32-biti

2020-03-22

想买个thinkpad,那款的性价比高点。资金4k左右。

有点痛 推荐联想集团是1984年中科院计算所投资十五万元人民币,由11名科技人员创办,是一家在信息产业内多元化发展的大型企业集团,充足创新性的国际化的科技公司。从1996年刚

2020-03-22