怎么优雅的处理Java异常?

  • 时间:
  • 浏览:1
  • 来源:大发彩神苹果下载app—大发彩神官方下载

代码错误,你这个 异常用于描述开发的代码错误,你这个 NPE,ILLARG,都属于守护守护进程员制造的BUG.

亲戚亲戚朋友提倡在业务处理的以前,可能发现无法处理直接抛出异常即可.

系统明明出了错误,你你这个 要是看那么了错误堆栈信息.

底下这句话出自<java编程思想>,你你这个 亲戚亲戚朋友思考如下几点:

注意你你这个 ,在你你这个 类中,亲戚亲戚朋友定义了另另一个log对象,分别指向 ServiceException.class 和 ModuleControllerAdvice.class . 你你这个 处理 ServiceException的以前使用了info级别的日志输出,这是很有用的.

最后亲戚亲戚朋友决定你你这个 异常继承自RuntimeException.你你这个 含高一另另一个接受一另另一个错误是因为的构造器,原本controller层要是都要知道异常,但会 我全局捕获到ServiceException做统一的处理即可,这无论是在struct1,2时代,还是springMVC中,甚至servlet年代,完整性都要极为容易的!

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

上述某种生活情况汇报可能web系统,是用户发起请求以前都要守候守护守护进程给予响应结果的.

只某种生活生活异常类,无法精准区分开异常类型

常常,亲戚亲戚朋友读罢了各种java的书,异常的各种机制,形态学 都很清楚,你你这个 始终还是他不知道如何使用,甚至背下了概念,却他不知道如何致用.

情况汇报码机制是个不错的确定,原本那么了一来,用户保存逻辑变了,比如增加一另另一个情况汇报,不允许修改可能离职的用户,那么了亲戚亲戚朋友还都要修改controller的代码,代码量增加,维护成本增高,你你这个 还耦合了service,不符合MVC设计模式.

你你这个 守护守护进程员错误的开发了代码,是因为保存过程中出現 异常,比如NPE.

可能某种生活是因为,亲戚亲戚朋友的守护守护进程无法保存到数据库.

而并完整性都要在逻辑处理的以前,用异常来判断逻辑进行的情况汇报.

在你你这个 以前,亲戚亲戚朋友就还可不可不都可以 很轻松的处理各种情况汇报了.

那么了缘何办呢?现在亲戚亲戚朋友来看下service代码如何编写

直接把异常抛给上层框架统一处理.

可能是后台作业,可能复杂性业务都要追溯性.你你这个 通常用流程判断得话控制,要用异常处理.亲戚亲戚朋友认为哪几只流程判断一定在一另另一个原子性处理中.你你这个 检查到(完整性都要遇到)的哪几只的疑问(完整性都要异常)都要记录到用户可友好查看的日志.你你这个 情况汇报属于处理反馈,暂且叫异常.

乐观锁机制发现用户可能被被人修改过.

关于上述Controller写法乍一看会有你你这个 冗余,可能无法理解,请仔细研读MVC设计模式. 先不管service,亲戚亲戚朋友来考虑下. 一另另一个业务系统可能不对用户提交的数据进行验证,验证包括两方面 :有效性和合法性,

可能可能得话描述清楚,你你这个 含高附加信息,比如都要在日志可能数据库记录消息ID,此时可能专门针对你你这个 重要/复杂性业务创建独立异常.

亲戚亲戚朋友找到了错误的位置,你你这个 完整性他不知道是可能哪几只.

浪费log日志存储空间,你你这个 栈顶并完整性都要最接近存在异常的代码位置.

为哪几只不定义成受查异常呢?可能是一另另一个受查异常,那么了是因为controller都要要处理你的异常.你你这个 可能有一天你的业务逻辑变了,可能多某种生活检查项,就都要增加一另另一个异常,反之都要删除一另另一个异常,那么了你的措施签名也都要改变,controller也随之要改变,这又变成了紧耦合,这和用情况汇报码123表示处理结果那么了哪几只不同.

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

改正后的逻辑

现在的哪几只的疑问是,前某种生活情况汇报亲戚亲戚朋友如何通知用户呢?

太久把书上的东西直接克隆下来,这里说一下容易记住的,你你这个 适合业务开发的.

可能你只都要一句概括,那么了直接定义一另另一个简单的异常,用于中断处理,你你这个 与用户保持友好交互即可.

原本一来首先有违MVC模式,二来逻辑十分不清晰,难以维护.本文结合工作经验,给出你你这个 异常使用建议,使用spring来实战异常为亲戚亲戚朋友带来的好处.

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

亲戚亲戚朋友还可不可不都可以 为每某种生活检查项定义一另另一个异常吗?还可不可不都可以 ,你你这个 那样显得太久余了.可能业务逻辑处理失败的以前,根据亲戚亲戚朋友需求,亲戚亲戚朋友只都要通知用户失败的是因为(通常应该是一段字符串),以及服务器受理失败的一另另一个情况汇报码(有时可能不都要情况汇报码,这要看你的设计了),原本这都要一另另一个含高是因为属性的异常即可满足亲戚亲戚朋友需求.

业务逻辑检查,也是意外情况汇报

在开发业务系统中,亲戚亲戚朋友目前绝大多数采用MVC模式,你你这个 往往一群人把service跟controller紧紧的耦合在一起去,甚至直接使用Threadlocal来隐式传值,你你这个 复杂性的逻辑几乎那么了使用service中存储的全局对象来传递处理结果,包括异常.

专有异常,多用于特定业务场景,用于描述指定作业出現 意外情况汇报无法预先处理.

各类异常都要要有单独的日志记录,可能分级,分类可管理.有的以前仅仅想给三方运维看得人逻辑异常.

业务系统也存在全都巨量任务处理的情况汇报.你你这个 哪几只任务完整性都要原子性的,现在MVC中的controller和service可完整性都要原子性的,不然为哪几只要区分那么了多层呢.

欢迎工作一到五年的Java工程师亲戚亲戚朋友们加入Java架构开发:8200113481

在service响应一另另一个情况汇报码机制,比如1 2 3表示错误信息,0 表示那么了任何错误.

对于前3种,亲戚亲戚朋友认为是有效性检查失败,第4种属与亲戚亲戚朋友无法处理的异常,第5种要是守护守护进程员bug.

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

可能那么了在乎下行带宽 ,考虑下重写Throwable的fillStackTrace措施一群人就要知道异常的开销大到底大在哪几只地方,fillStackTrace是一另另一个native措施,会填充异常类内控 的运行轨迹.

系统运行出错,你你这个 完整性他不知道错误存在的位置.

你有责任处理异常

系统有千万并发,可能还去考虑哪几只中规中矩的按部就班的措施,别忘了MVC原本就浪费全都资源,代码量增加全都.

亲戚亲戚朋友先来看一另另一个例子:

有效性: 比如用户所在岗位,否是是属于数据库有记录的岗位ID,可能不存在,无效.

群内提供免费的Java架构学习资料(底下有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用被委托人每一分每一秒的时间来学习提升被委托人,暂且再用"那么了时间“来掩饰被委托人思想上的懒惰!趁年轻,使劲拼,给未来的被委托人一另另一个交代!

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

逻辑异常,你这个 异常用于描述业务无法按照预期的情况汇报处理下去,属于用户制造的意外.

要修改的用户ID不存在.

原本一来但会 我亲戚亲戚朋友检查到不允许保存的项目,亲戚亲戚朋友就还可不可不都可以 直接throw 一另另一个新的异常,异常机制会帮助亲戚亲戚朋友中断代码执行.

异常不提供无参构造器,可能绝对不允许你抛出一另另一个逻辑处理异常,你你这个 不指明是因为,想看得人,你是都要要告诉用户为哪几只受理失败的!

那么了一来,亲戚亲戚朋友只都要全局统一处理下 ServiceException 就还可不可不都可以 了,很好,spring为亲戚亲戚朋友提供了ControllerAdvice机制,有关ControllerAdvice,还可不可不都可以 查阅springMVC使用文档,下面是一另另一个简单的示例:

异常处理下行带宽 很低

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

考虑如下场景: 系统提供一另另一个API,用于修改用户信息,服务器端采用json数据交互.首先亲戚亲戚朋友定义ServiceException,用来表示业务逻辑受理失败,它仅表示亲戚亲戚朋友处理业务的以前发现无法继续执行下去.

你有能力处理异常,你你这个 你知道如何处理

上述代码要是典型的使用异常来处理业务逻辑.你你这个 措施都要严重的禁止!上述代码最大的哪几只的疑问在于,亲戚亲戚朋友如何利用异常来自动处理事务呢?

一直看得人你你这个 项目,在全局定义一另另一个 AppException,你你这个 所有地方都只抛出你你这个 异常,你你这个 把捕获的异常case到你你这个 AppException中.会有如下哪几只的疑问:

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

在controller 使用try-catch进行处理.

显然前2种措施完整性都要可取,可能MVC不设计模式他不知道们,controller是用来接收页面参数,你你这个 调用逻辑处理,最后组织页面响应的地方.亲戚亲戚朋友那么了能在controller进行逻辑处理,controller只应该负责用户API入口和响应的处理(如若不然,思考一下可能有一天service的代码打包成jar放满原本平台,那么了controller了,该缘何办?)

接下来有2种确定:

接下来看下Controller层.

UnknownHostException,表示找那么了原本的主机,你你这个 异常和NoUserException有哪几只区别么?换言之,那么了原本的主机是异常,那么了原本的用户完整性都要异常了么? 全都一定要弄明白哪几要是用异常来控制逻辑,哪几要是定义守护守护进程异常.

在ccontroller 调用userService的checkUserExist()措施.

亲戚亲戚朋友开发的业务系统,可能是产品,常常面临着原本的哪几只的疑问:

那么了一来那么了任何地方都要关心异常,可能业务逻辑校验失败的情况汇报.用户也还可不可不都可以 得到很友好的错误提示.

其次,ServiceException暂且一定要记录日志,亲戚亲戚朋友应该提供独立的log对象,方便开关.

第1种措施是不可取的,注意亲戚亲戚朋友抛出的ServiceException,它仅仅逻辑处理异常,你你这个 亲戚亲戚朋友的措施前面那么了声明throws ServiceException,这表示他是一另另一个非受查异常.controller也那么了关心会存在哪几只异常.

首先,ServiceException一定要和你你这个 的代码错误分离,不应该混为一谈.

在controller直接书写业务逻辑.

接下来你可不可不都可以 在修改用户的以前想客户端响应原本的JSON

然而这和亲戚亲戚朋友的异常中断service那么了哪几只冲突.也并完整性都要一回事.

有效性检查,还可不可不都可以 交给java的校验框架执行,比如JSR2003. 假设用户提交的数据经过验证都合法,还是有你你这个 情况汇报是那么了调用修改逻辑的.