程序执行中发生的不正常情况(语法错误逻辑错误不是非常)称为非常,全部的非常都继承与java.lang.Throwable 。Throwable 有两个重要子类
- Error(错误):Java虚拟机无法解决的严重问题,我们没办法通过 catch 来举行捕获 。如:内存溢出(OutOfMemoryError)、Java 虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。error 是严重错误,Java虚拟机会选择线程终止
- Exception(非常):编程错误或偶尔的外在因素导致的一般问题,程序本身可以处理的非常,可以通过 catch 来举行捕获。Exception 又可以分 运行时非常(程序运行时发生的非常)和编译时非常(程序编译期间产生的非常,必须要处理的非常,否则代码没法编译通过)。
当一个方法产生某种非常,但是不确定如那边理这种非常,那么就需要在该方法的头部表现地申明抛出非常,表明该方法将不对这些非常举行处理,而用该方法调用者负责处理6.2.3.1 thorows
throw用来直接抛出一个非常①语法
当Java提供的内置非常类型不能满足我们的需求时,我们可以计划自己的非常类型。①语法格式
Java7以后,catch 语句可以有多个,用来匹配多个非常①语法格式
日常开辟中,我们处理非常一般都会用到try-catch 、throw和throws 的方式抛出非常。9.1 全局非常捕获与处理
这种方式不经程序员处理贫苦,对用户来说也不太友好
我们都渴望不消写过多的重复代码处理非常,又能提升用户体验。这时候全局非常处理就显得很便捷很重要了
Springboot对提供了一个 @ControllerAdvice注解以及 @ExceptionHandler注解,分别用于开启全局的非常捕获和说明捕获哪些非常,对那些非常举行处理。
ErrorEnum枚举类中定义了常见的错误码以及错误的提示信息。至于这里为什么用枚举就不具体说了,网上文章说说的也比较多了
SuccEnum 枚举类中定义了成功码及成功提示信息
这里我们定义好了统一的结果返回,其中里面的静态方法是用来当程序非常的时候转换成非常返回规定的格式。
内置非常不能满足我们业务需求的时候,我们就需要自定义非常
我们自定义一个全局非常处理类,来处理各种非常,包罗自己定义的非常和内部非常。如允许以简化不少代码,不消自己对每个非常都利用try,catch的方式来实现
说明:无法通过预检查的非常不在此列,好比当解析字符串情势的数字时,可能存在数字格式错误,通过catch NumberFormatException实现正例:
说明:非常计划的初衷是解决程序运行中各种不测,且非常的处理效率比条件判定方式要第许多。③【强制】 catch 时请分清稳定代码和非稳定代码。稳定代码一般指本机运行且执行结果确定性高的代码。对于非稳定代码的catch 尽可能在举行非常类型的分区后,再做对应的非常处理
说明:对大段代码举行try-catch,将使程序无法根据不同的非常做出正确的“应激”反应,也倒霉于定位问题,这是一种不负责的表现正例:在用户注册场景中,如果用户输入非法字符串,或用户名称已存在,或用户输入的密码过于简单,那么程序会作出分门别类的判定并提示用户。
说明:对于JDK7即以上版本,可以利用try-catch-resource 方式⑦【强制】 不要在finally块中利用return
说明try 块中return 语句执行成功后,并不马上返回,而是继续执行finally 块中的语句,如果此处存在return语句,则在此直接返回,无情地丢弃try块中的返回点。正例:
说明:如果以及对方抛出的时绣球,实际接收到的时铅球,就会产生不测⑨【强制】 在调用RPC、二方包或动态生成类的相关方法时,捕获非常必须利用Throwable拦截。
说明:通过反射机制调用方法,如果找不到方法,则抛出NoSuchMethodException。⑩【推荐】 方法的返回值可以为null,不强制返回空集合或者空对象等,必须添加注释充实说明在说明情况下会返回null值。此时数据库id不支持存入负数二抛出非常。
在说明情况下抛出NoSuchMethodException呢?二方包在类冲突时,仲裁机制可能导致引入非预期的版本使类的方法签名不匹配,或者在字节码修改框架(好比:ASM)动态创建或修改类时,修改了相应的方法签名。对于这些情况,即使在代码编译期是正确的,在代码运行期也会抛出NoSuchMethodException
说明:本手册明确,防止产生NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑远程调用失败、序列化失败、运行时非常等场景返回null值的情况⑪【推荐】 防止产生NPE时程序员的根本修养,注意NPE产生的场景。
说明:关于RPC方法返回方式利用Result方式的理由⑭【参考】 制止出现重复的代码(Don't Repeat Yourself),即DRY原则
1)利用抛出非常返回方式,调用方式如果没有捕获到,就会产生运行时错误
2)如果不加栈信息,知识new自定义非常,参加自己理解的errorMesage,对于调用解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能消耗也是问题。
说明: 随意复制和粘贴代码,必然导致代码的重复,当以后需要修改时,需要修改全部的副本,容易遗漏。必要时抽取共性方法或公共类,甚至将代码组件化。正例: 一个类中由多个public 方法,都需要举行数行相同的参数校验操作,这个时候请抽取:
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |