怎么优雅的处理Java异常?

  • 时间:
  • 浏览:1
  • 来源:uu快3开奖历史_uu快3玩法_注册

时不时想看 什么都项目,在全局定义哪有几个 多 AppException,否则所有地方都只抛出并与非 异常,否则把捕获的异常case到并与非 AppException中.会有如下问题报告 :

上述代码只是我典型的使用异常来防止业务逻辑.并与非 方法 须要严重的禁止!上述代码最大的问题报告 在于,大伙何如利用异常来自动防止事务呢?

常常,大伙读罢了各种java的书,异常的各种机制,形状都很清楚,否则始终还是让人要知道何如使用,甚至背下了概念,却让人要知道何如致用.

异常防止深度很低

第1种方法 是不可取的,注意大伙抛出的ServiceException,它仅仅逻辑防止异常,否则大伙的方法 前面如此声明throws ServiceException,这表示他是哪有几个 多非受查异常.controller也如此关心会趋于稳定哪些地方异常.

那我一来若果大伙检查到不允许保存的项目,大伙就都都可不可不可不可以直接throw 哪有几个 多新的异常,异常机制会帮助大伙中断代码执行.

关于上述Controller写法乍一看会有什么都冗余,事先无法理解,请仔细研读MVC设计模式. 先不管service,大伙来考虑下. 哪有几个 多业务系统不事先不对用户提交的数据进行验证,验证包括两方面 :有效性和合法性,

业务逻辑检查,也是意外情況

UnknownHostException,表示找都都可不可不可不可以 那我的主机,并与非 异常和NoUserException哪些地方地方区别么?换言之,如此那我的主机是异常,如此那我的用户完整版完整版都是异常了么? 什么都一定要弄明白哪些地方是用异常来控制逻辑,哪些地方是定义线程异常.

我不需要把书上的东西直接克隆下来,这里说一下容易记住的,否则适合业务开发的.

用户被锁定,不允许修改.

最后大伙决定并与非 异常继承自RuntimeException.否则带有哪有几个 多接受哪有几个 多错误是因为的构造器,那我controller层只是我须要知道异常,若果全局捕获到ServiceException做统一的防止即可,这无论是在struct1,2时代,还是springMVC中,甚至servlet年代,完整版完整版都是极为容易的!

在controller直接书写业务逻辑.

大伙开发的业务系统,事先是产品,常常面临着那我的问题报告 :

如此一来如此任何地方须要关心异常,事先业务逻辑校验失败的情況.用户也都都可不可不可不可以得到很友好的错误提示.

系统有千万并发,不事先还去考虑哪些地方地方中规中矩的按部就班的方法 ,别忘了MVC那让人浪费什么都资源,代码量增加什么都.

大伙提倡在业务防止的事先,事先发现无法防止直接抛出异常即可.

综上,笔者通常分为如下几类:

直接把异常抛给上层框架统一防止.

专有异常,多用于特定业务场景,用于描述指定作业老出意外情況无法预先防止.

异常不提供无参构造器,事先绝对不允许你抛出哪有几个 多逻辑防止异常,否则不指明是因为,想想看 ,你是须要要告诉用户为哪些地方受理失败的!

欢迎工作一到五年的Java工程师大伙们加入Java架构开发:860 113481

事先你只须要一句概括,如此直接定义哪有几个 多简单的异常,用于中断防止,否则与用户保持友好交互即可.

你有能力防止异常,否则你知道何如防止

书中所示的例子,是在循环中小量使用try-catch进行检查,否则业务系统,用户发起请求的次数与该场景天壤地别.淘宝的11`11是个很好的反例.否则请你的系统上到并与非 级别再考虑并与非 问题报告 .

考虑如下场景: 系统提供哪有几个 多API,用于修改用户信息,服务器端采用json数据交互.首先大伙定义ServiceException,用来表示业务逻辑受理失败,它仅表示大伙防止业务的事先发现无法继续执行下去.

而并完整版完整版都是在逻辑防止的事先,用异常来判断逻辑进行的情況.

注意什么都,在并与非 类中,大伙定义了哪有几个 多log对象,分别指向 ServiceException.class 和 ModuleControllerAdvice.class . 否则防止 ServiceException的事先使用了info级别的日志输出,这是很有用的.

乐观锁机制发现用户事先被被人修改过.

你有责任防止异常

然而这和大伙的异常中断service没哪些地方地方冲突.也并完整版完整版都是一回事.

情況码机制是个不错的选折 ,那我如此一来,用户保存逻辑变了,比如增加哪有几个 多情況,不允许修改事先离职的用户,如此大伙还须要修改controller的代码,代码量增加,维护成本增高,否则还耦合了service,不符合MVC设计模式.

在controller 使用try-catch进行防止.

其次,ServiceException不需要说一定要记录日志,大伙应该提供独立的log对象,方便开关.

代码错误,类事异常用于描述开发的代码错误,类事NPE,ILLARG,都属于线程员制造的BUG.

大伙找到了错误的位置,否则完整版让人要知道是事先哪些地方.

事先是后台作业,事先复杂业务须要追溯性.并与非 通常用流程判断语句控制,要用异常防止.大伙认为哪些地方地方流程判断一定在哪有几个 多原子性防止中.否则检查到(完整版完整版都是遇到)的问题报告 (完整版完整版都是异常)须要记录到用户可友好查看的日志.并与非 情況属于防止反馈,不需要说叫异常.

对于前3种,大伙认为是有效性检查失败,第4种属与大伙无法防止的异常,第5种只是我线程员bug.

事先如此在乎深度,考虑下重写Throwable的fillStackTrace方法 让让我们 歌词 让让我们 歌词 就要知道异常的开销大到底大在哪些地方地方,fillStackTrace是哪有几个 多native方法 ,会填充异常类内部内部结构的运行轨迹.

什么都线程员错误的开发了代码,是因为保存过程中老出异常,比如NPE.

里面这句话出自<java编程思想>,否则大伙思考如下几点:

在service响应哪有几个 多情況码机制,比如1 2 3表示错误信息,0 表示如此任何错误.

本文仅按照业务系统开发深度描述异常的什么都防止看法.不涉及java的异常基础知识,都都可不可不可不可以自行查阅《Java核心技术 卷I》和《java编程思想》都都可不可不可不可以得到更多的基础信息.

那我一来首先有违MVC模式,二来逻辑十分不清晰,难以维护.本文结合工作经验,给出什么都异常使用建议,使用spring来实战异常为大伙带来的好处.

接下来有2种选折 :

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用我本人每一分每一秒的时间来学习提升我本人,不需要说再用"如此时间“来掩饰我本人思想上的懒惰!趁年轻,使劲拼,给未来的我本人哪有几个 多交代!

现在的问题报告 是,前并与非 情況大伙何如通知用户呢?

事先不事先语句描述清楚,否则带有附加信息,比如须要在日志事先数据库记录消息ID,此时事先专门针对并与非 重要/复杂业务创建独立异常.

有效性检查,都都可不可不可不可以交给java的校验框架执行,比如JSR60 3. 假设用户提交的数据经过验证都合法,还是有什么都情況是都都可不可不可不可以 调用修改逻辑的.

各类异常须要要有单独的日志记录,事先分级,分类可管理.有的事先仅仅想给三方运维想看 逻辑异常.

有效性: 比如用户所在岗位,与非 属于数据库有记录的岗位ID,事先不趋于稳定,无效.

在ccontroller 调用userService的checkUserExist()方法 .

事先并与非 是因为,大伙的线程无法保存到数据库.

在开发业务系统中,大伙目前绝大多数采用MVC模式,否则往往一帮人把service跟controller紧紧的耦合在同時 ,甚至直接使用Threadlocal来隐式传值,否则复杂的逻辑几乎都都可不可不可不可以都可不可不可不可以 使用service中存储的全局对象来传递防止结果,包括异常.

接下来看下Controller层.

显然前2种方法 完整版完整版都是可取,事先MVC不设计模式让人要知道们,controller是用来接收页面参数,否则调用逻辑防止,最后组织页面响应的地方.大伙都都可不可不可不可以 否在controller进行逻辑防止,controller只应该负责用户API入口和响应的防止(如若不然,思考一下事先有一天service的代码打包成jar装下 去那我平台,如此controller了,该为啥办?)

如此一来,大伙只须要全局统一防止下 ServiceException 就都都可不可不可不可以了,很好,spring为大伙提供了ControllerAdvice机制,有关ControllerAdvice,都都可不可不可不可以查阅springMVC使用文档,下面是哪有几个 多简单的示例:

在并与非 事先,大伙就都都可不可不可不可以很轻松的防止各种情況了.

笔者文笔功力尚浅,言语多有不妥,请慷慨指正,必定感激不尽. 本文提出了哪有几个概念:防止反馈业务异常代码错误,请认真思考一下各中区别.

浪费log日志存储空间,否则栈顶并完整版完整版都是最接近趋于稳定异常的代码位置.

改正后的逻辑

异常类后期难以修改以增加其携带的信息.

系统运行出错,否则完整版让人要知道错误趋于稳定的位置.

为哪些地方不定义成受查异常呢?事先是哪有几个 多受查异常,如此是因为controller须要要防止你的异常.否则事先有一天你的业务逻辑变了,事先多并与非 检查项,就须要增加哪有几个 多异常,反之须要删除哪有几个 多异常,如此你的方法 签名也须要改变,controller也随之要改变,这又变成了紧耦合,这和用情況码123表示防止结果没哪些地方地方不同.

都都可不可不可不可以都可不可不可不可以 并与非 异常类,无法精准区分开异常类型

逻辑异常,类事异常用于描述业务无法按照预期的情況防止下去,属于用户制造的意外.

系统明明出了错误,否则只是我看都都可不可不可不可以 错误堆栈信息.

上述并与非 情況事先web系统,是用户发起请求事先须要等待时间线程给予响应结果的.

业务系统也趋于稳定什么都巨量任务防止的情況.否则哪些地方地方任务完整版完整版都是原子性的,现在MVC中的controller和service可完整版完整版都是原子性的,不然为哪些地方要区分如此多层呢.

要修改的用户ID不趋于稳定.

首先,ServiceException一定要和什么都的代码错误分离,不应该混为一谈.

接下来让人在修改用户的事先想客户端响应那我的JSON

大伙先来看哪有几个 多例子:

大伙都都可不可不可不可以为每并与非 检查项定义哪有几个 多异常吗?都都可不可不可不可以,否则那样显得过多余了.事先业务逻辑防止失败的事先,根据大伙需求,大伙只须要通知用户失败的是因为(通常应该是一段字符串),以及服务器受理失败的哪有几个 多情況码(有时事先不须要情況码,这要看你的设计了),那我这须要哪有几个 多带有是因为属性的异常即可满足大伙需求.

如此为啥办呢?现在大伙来看下service代码何如编写

合法性: 比如用户名只允许输入最多1哪有几个 多字符,用户提交了20个字符,不合法.