Skip to content

第六章 异常处理与日志 v1.0 ​

第一部分 异常类型 ​

一、概述 ​

1.异常类型解释 ​

在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error。

  • Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
  • Error 定义了在通常环境下不希望被程序捕获的异常。一般指的是 JVM 错误,如堆栈溢出。

其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

二、常见异常 ​

1.常见运行时异常 ​

2.常见非运行时异常 ​

第二部分 异常处理 ​

一、概述 ​

1.异常处理关键字 ​

Java 的异常处理通过5个关键字来实现:try、catch、throw、throws 和 finally

2.异常处理执行流程图 ​

image.png

二、处理异常 ​

1.基本结构 ​

java
try {  // 用try-catch语句捕获并处理异常
    逻辑程序块
} catch(ExceptionType1 e) {
    处理代码块1
} catch (ExceptionType2 e) {
    处理代码块2
    throw(e);    // 抛出这个异常
} catch (ExceptionType3|ExceptionType4) {  //Java7提供多异常捕获
    处理代码块3
} catch (Exception e) {
    e.printStackTrace();  // 打印异常栈信息
} finally {
    释放资源代码块  // 不管有无异常,除exit()外,总会在最后执行;即使return,也会在其之前执行
}

2.抛出异常 ​

基本结构:throw ExceptionObject;

3.异常声明 ​

当一个方法产生一个它不处理的非运行时异常(运行时异常无需声明,会自动捕获)时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。

基本结构:返回值 方法名(参数列表) throws Exception1, Exception2, ... {...}​

规范格式:返回值 方法名(参数列表) throws Exception {...}

4.自定义异常类 ​

自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。

java
class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String s) {
        super(s);
    }
}

第三部分 日志 ​

一、体系结构 ​

1.Java日志规范 ​

一些接口,提供给日志的实现框架设计的标准。

  • 日志规范接口(Commons Logging, JCL)
  • 简单日志接口(Simple Logging Facade for Java, slf4j)

2.常见日志框架 ​

  • Log4j
  • JUL(java.util.logging)
  • Logback

二、Logback框架 ​

Logback是由log4j创始人设计的另一个开源日志组件,基于slf4j实现,性能比log4j要好。

1.三大技术模块 ​

  1. logback-core:logback-core模块为基础模块,为其他两个模块奠定了基础。
  2. logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API。
  3. logback-access模块:与Tomcat和Jetty等Servlet容器集成,以提供HTTP访问日志功能

实现Logback最小依赖模块:slf4j-api(日志规范)、logback-core、logback-classic

2.使用Maven构建 ​

xml
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.12</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.12</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>

注意:低版本JDK可能不支持最新版本,可能需要降低依赖版本,以上配置JDK8可用。

3.配置文件(logback.xml) ​

应当放置在resources根目录下,用于配置Logback框架

xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- CONSOLE :表示当前的日志信息是可以输出到控制台的 -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!--输出流对象 默认 System.out 改为 System.err  其中err:控制台输出日志为红色,而out为黑色-->
    <target>System.out</target>
    <encoder>
      <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>
    </encoder>
  </appender>

  <!-- File:表示当前的日志信息是可以输出到文件的 -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <!--日志输出路径(logback_message.log是文档名,下方还有一处文件名(不用写.log))-->
    <file>D:/Programming_Learning/Java Code/GuoZiYunLearning/project/logback-try/src/main/resources/log/log.log</file>
    <!--指定日志文件拆分和压缩规则(防止文件过大)-->
    <rollingPolicy
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!--通过指定压缩文件名称,来确定分割文件方式-->
      <fileNamePattern>D:/Programming_Learning/Java Code/GuoZiYunLearning/project/logback-try/src/main/resources/log/logback_message-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
      <maxFileSize>1MB</maxFileSize> <!--文件拆分大小-->
    </rollingPolicy>
  </appender>

  <!--
  level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF(关掉),默认debug(可忽略大小写)
  <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
  -->
  <root level="ALL"> <!--打印规则:只打印不低于当前级别的日志-->
    <appender-ref ref="CONSOLE"/> <!--如果这个地方不配置关联打印的位置,改位置将不会记录日志-->
    <appender-ref ref="FILE" level="WARN"/><!--可以为各元素单独配置日志级别-->
  </root>
<!--   <logger name="指定软件包" level="ALL" additivity="true" >  
    <appender-ref ref="..."/>
  </logger> -->
</configuration>

4.创建与使用日志对象 ​

java
public static final Logger LOGGER= LoggerFactory.getLogger("当前类.java");  //如:Test.class
public static void main(String[] args) {
    LOGGER.info("程序执行中");  //INFO级别输出
}

5.日志级别设置 ​

级别程度依次是: TRACE<DEBUG<INFO<WARN<ERROR;默认级别是DEBUG(忽略大小写),对应其方法。

具体在<root level="INFO">标签或其元素appender-ref的level属性中设置日志级别。

​