常见异常分类1

Throwable

Error:
OutOfMemoryError(00M)
Exception:
SQL Exception
IOException
FileNotFoundException
RuntimeException
NullPointerException
ClassCastException
ArithmeticException
IndexOutOfBoundsException
ArrayIndexOutOfBoundsException
StringIndex0utOfBoundsException

在以上分支中,Error:表示错误,如果出现,通常需要升级硬件、调整JVM配置,或修改程序源代码来解决问题!、 Exception表示异常,即程序有可能无法执行到预期正确的结果,在异常中,主要分为一般异常和RuntimeException,如果程序执行过程中,出现一般异常,编写时代码时,调用方法的代码会出错,需要通过“try… . catchi或throws、方式进行处理,如果出现RuntimeException^,则没有明确的语法要求,在源代码中并不会提示
任何错误!无论是错误,还是异常,都是在运行过程中才暴露出来的!

Java语言对“RuntimeException^及其子孙类异常没有作语法的约束,即使某个方法可能抛出这些异常,但是,并不需要在程序代码中显式的进行语法的处理,即没有、try…catchi或、throws、 源代码也不会报错!主要因为这些异常出现的频率可能很高,并且这些一场可以杜绝。

-般的异常,是一-定有出现的概率的,万出现了,就必须要有对应的解决方案,所以,这些异常,在Java的语法中要求必须try… catchi或throws’,以对这些异常进行处理!对异常处理的本质主要是“善后;给出一定的警示,避免再次出现”!

在编写项目时,如果调用某个方法可能出现异常,如果当前代码适合处理(能善后,能警示),则应该捕获并处理(i try…catch"), 如果不适合处理,则应该抛出( throw^ +~ throws’ )

例如,在项目中,如果Servicei组件中出现了异常,但是,、Service组件并不负责与客户端进行交互,则无法直接给予客户端错误提示(警示),应该将异常抛出( throws’ ),如果Controller 组件中出现了异常,由于控制器可以给 予客户端错误提示,应该捕获并处( try… catch), 在处理过程中,响应错误提示到客户端;如果Service^把异常捕获并处理了,则在“Controller:中将无法发现异常,更加无法处理异常,也就无法给客户端错误提示了,则异常就没有被正确的处理!

在SpringMVC框架中,提供了统一 处理异常的做法!具体的表现为:专门使用1个方法(也可以是多个)处理多种异常,在处理请求的方法中,就不必再关心这些异常了,处理请求时,只需要将异常抛出,框架会自动调用统一处理异常的方法进行处理 !
关于统一 处理异常的方法:
1.需要添加^ @ExceptionHandler注解;
2.应该使用“public^权限;
3.返回值的设计原则与处理请求的方法的返回值相同,即:可以转发,可以重定向,也可以响应正文;
4.方法名称自定义;
5.参数列表中,必须至少包含1个异常类型的参数,且该异常类型大于所有可能需要处理的异常。

所以,在UserController中添加处理异常的方法:

public JsonResult<Void> aaaaa(Throwable e) {
    JsonResult<Void> jr = new JsonResult<Void>();
    if (e instanceof UsernameDuplicateException) {
        jr.setState(2);
        jr.setMessage("用户名错");
    } else if (e instanceof InsertException) {
        jr.setState(3);
        jr.setMessage("插入数据失败");
    }
    return jr;
}

关于@ExceptionHandler注解,可以在注解参数中配置所需要处理的异常的类型,例如配置为:@ExceptionHandler(ServiceException.class)

如果没有配置参数,表示所有异常都由接下来的方法进行处理,如果配置以上代码,则表示只处理ServiceException类型的异常,通过这样的配置,限制处理范围,避免处理过当。

该注解的参数类型是数组类型的,所以,也可以配置为多种类型的异常都由接下来的方法进行处理,例如:
@ExceptionHandler({ServiceException.class, RuntimeException.class})

以上处理方式仅作用于当前控制器类!如果处理异常的方法不在对应的控制器类中,可以为该方法所在的类添加^ @ControllerAdvice、注解,则可以全局应用,即应用到整个项目中,项目中的任何一个控制器类中处理请求的方法抛出相关异常,都可以被处理!使用这种做法时,如果处理异常后,需要响应正文,还需要在处理异常的方法之前添加@ResponseBody注解,或者,直接在类之前改为使用、@RestControllerAdvice !

注意:~ @ControllerAdvice和@RestControllerAdvice 在SpringMVC框架中,默认是不识别的!而在SpringBoot项目中可以直接使用!
如果不使用这些注解,也希望处理异常的方法能作用于多个控制器类,也可以选择将处理异常方法写在控制器类的基类中!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值