1.异常处理

1.1.异常处理的必要性

  异常处理用于解决一些程序无法掌控,但又必须面对的情况。例如,程序需要读取文件、连接网络、使用数据库等,但可能文件不存在、网络不畅通、数据库无效等情况。为了程序能继续运行, 此时就需要把这些情况进行异常处理。异常处理的方法通常有以下几种:

  • 将异常通知给开发人员、运维人员或用户。
  • 使因为异常中断的程序以适当的方式继续运行,或者退岀。
  • 保存用户的当前操作,或者进行数据回滚。
  • 释放资源。

1.2.异常的分类

  • Error:代表编译和系统的错误,不允许捕获。
  • Exception:标准Java库的方法所激发的异常,包含运行异常Runtime_Exception和非运行异常Non_RuntimeException的子类。
  • Runtime Exception:运行时异常。
  • Non_RuntimeException:非运行时可检测的异常,Java编译器利用分析方法或构造方法中可能产生的结果来检测程序中是否含有检测异常的处理程序,每个可能的可检测异常、方法或构造方法的throws子句必须列出该异常对应的类。
  • Throw:用户自定义异常。

1.3.如何处理异常

(1)捕获异常。

try {

}catch (Exception e) {

}finally {

}

代码解释如下。

  • try:在try语句中编写可能发生异常的代码,即正常的业务功能代码。如果执行完try语句不发生异常,则执行finally语句(如果有的话)和finally后面的代码;如果发生异常,则尝试去匹配catch语句。
  • catch:捕捉错误并处理。
  • finally: finally语句是可选的,无论异常是否发生、是否匹配、是否被处理,finally都会执行。

—个try至少要有一个catch语句,或至少要有1个finally语句,finally不是用来处理异常的, 也不会捕获异常,是为了做一些清理工作,如流的关闭、数据库连接的关闭等。

(2)抛出异常

除用try语句处理异常外,还可以用throw, throws抛出异常。

执行throw语句的地方是一个异常抛出点,后面必须是一个异常对象,且必须写在函数中。

    • throw 语法:

      throw (异常对象);

    • throws 语法:

[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{……}

(3)自定义异常

  在应用程序的开发过程中,经常会自定义异常类,以避免使用try产生重复代码。自定义异常类 —般是通过扩展Exception类来实现的。这样的自定义异常属于检查异常(checked exception )。如果要自定义非检查异常,则需要继承RuntimeException

1.4.Spring Boot默认的异常处理

 Spring Boot提供了一个默认处理异常的映射。在Spring Boot的Web项目中,尝试访问一 个不存在的 URL (https://localhost:8080/every ),会得到 Spring Boot 中内置的异常处理, 如下提示:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat May 18 22:49:20 CST 2019

There was an unexpected error (type=Not Found, status=404)

No message available

同样的地址,如果发送的请求带有 Content-Type->application/json;charset=UTF-8, 则返回的是JSON格式的错误结果,见以下输岀结果:


{

"rimestamp": "2019-05-18T14:47:46.722+0000",

"status": 404,

"error": "NotFound",

"message": "No message available",

"path": "/longzhiran"

}

  从上面结果可以看岀,Spring Boot会根据消费者发送的“Content-Type”来返回相应的异常内容,如果“Content-Type”是“application/json”,则返回 JSON 文件;如果“Content-Type” 是”text/html”,则返回HTML文件。