java异常处理与日志框架

目录

1.认识异常

2.异常处理机制 

1.异常处理结构

2.在程序中处理异常 

3.使用try-catch-finally语句处理异常 

4.多重catch语句

 5.异常分类及处理流程

1.Error类

2.Exception类

 6.抛出异常——throw关键字

7.自定义异常 

3.日志框架Log4j 2

1.java中的日志框架

2.记录日志 


1.认识异常

在程序大发过程中,程序员虽然会避免错误的发生,但总会遇到一些不可预期的问题,如除法运算时除数为0、数组下标越界、数据类型不一致,内存不足、溢出等,这些就是异常。

对于上面使用if-else语句进行处理后会发现,程序增加了很多判断和分支的错误处理机制,总结有如下两个缺点。

  • 无法穷举所有的异常情况
  • 因为受程序员知识的限制,异常情况总比可以考虑到的情况多,总会有"漏网之鱼",所以程序总不够健壮。
  • 影响错误处理和业务逻辑混杂的代码严重影响程序的可读性,增加程序维护的难度。是否可以程序自动判断异常和算是异常呢?在java中提供的异常处理机制可以解决这些问题。

2.异常处理机制 

java的异常处理机制也承受着面向对象的基本思想,在java中,所有的异常都定义为类。除了内置的异常类java也可以自定义异常类。此外,java的异常处理机制也允许自行抛出异常。

1.异常处理结构

java针对异常的处理提供了try、catch、finally、throws、throw五个核心关键字,其中前三个关键字就可以组成常用的异常处理结构,语法如下:

try{

//有可能出现异常的语句

}[catch(异常类型 异常对象){

//异常处理语句

}] [finally{

//一定会运行到的语句

}]

其中,try语句用于监听,将可能抛出异常的代码放在try语句块内,当try语句块内发生异常时,异常被抛出;catch语句用于捕获异常,catch语句用来捕获try语句块中抛出的异常;finally语句块总会被执行,主要用于回收try语句块内打开的资源,如数据库连接、网络连接和磁盘文件。

2.在程序中处理异常 

  • 既然程序员通过自行判断处理异常会有诸多不便,那么下面运用java异常处理机制让程序能够自行判断并处理异常。 
  • 当程序出现异常时,异常会被try语句监听到,然后被JVM抛出,被catch语句捕获进行处理,执行catch语句内的异常处理代码,不再需要程序员自行编写if语句进行判断,
  • 使用java异常处理机制的目的是帮助程序员发现异常并解决异常。不能明确地描述异常类型,不能精确定位问题所在。更好的方法是使用是使用异常类中提供的printStackTrace()方法进行异常信息的完整输出。

Exception类型的常用方法

3.使用try-catch-finally语句处理异常 

这样在异常处理过程中,无论是否出现异常,最终都会执行finally语句块中的代码。finally语句往往会在开发中进行一些资源释放操作,无论代码是否正常执行都必须完成这些操作。

4.多重catch语句

在之前的案例中,程序出现的全部异常有统一的处理方式。但在实际开发中,有时会希望针对不同的异常类型采取不同的处理方式,这样就需要使用多重catch语句进行异常处理语法如下:

  

 5.异常分类及处理流程

前面已经介绍了异常处理及其对程序正常执行的生要性。为了能更好地理解异常的继承结构,必须理解异常的继承结构及处理流程。

1.Error类

java.lang.Error类包含仅靠程序本身无法恢复的严重错误,一般指与JVM相关的问题,是java运行环境的内部错误或硬件问题,如内存资源不足、JVM错误等。应用程序不应抛出这种类型的对象(一般由JVM抛出)。假如出现这种错误,除尽力使程序安全退出外,其他方法是无能为力的。因此在进行程序设计时,应该更关注Exception类。

2.Exception类

java.lang.Exception类是程序本身可以处理的异常,可分为运行时(RunTimeException)异常与检查(Checked)异常。

  • 运行时异常:可以在程序中避免的异常。这类异常在编译代码时不会被编译器检测出来,可以正常编译运行,但当程序进行时发生异常,会输出异常堆栈信息并中止程序运行,程序员可以根据需要使用try-catch语句捕获这类异常,如空指针异常、类型转换异常、数组越界异常等,这些异常包括java.long.RuntiomeException类及其子类,通过这些具体的异常类型,能够判断程序的问题所有。java程序中常见的运行如下表所示。
  • Checked异常:除运行时异常外的异常,是由用户错误或问题引起的异常,这是程序员无法预见的。在编译时,编译器会提示这类异常需要捕获。如果不进行捕获,则会出编译错误。常见的编译异常有FileNotFoundException异常、SQLException异常等。 

 6.抛出异常——throw关键字

使用try-catch-finally语句进行异常处理,在这个异常处理结构中,由JVM进行判断并抛出异常信息,也就是程序遇到异常时会自动处理。但是有时可能会出现以下状况。

  • 需要根据程序逻辑自定义异常类,这些异常类在java异常体系中关未提供,不能抛出。例如:当程序中的注册流程执行时发生错误,需要抛出自定义的注册异常精确定位问题所在,但是注册异常在java异常体系中不存在,就不能被自动捕获
  • 根据业务需要自行选择异常抛出时机或自定义异常处理逻辑。例如:根据不同的逻辑判断条件处理逻辑。由于使用throw关键字抛出的异常。
  • 在以上情况中,就需要使用throw关键字自行手动抛出异常,由调用者处理抛出异常的时机和异常处理逻辑。由于使用throw关键字抛出的异常是异常类的对象,所以可以使用new关键字创建异常类的对象,通过throw关键字抛出,语法如下:

7.自定义异常 

当java异常体系中提供的异常类型不能满足程序的需要时,可以自定义异常类,使用自定义异常一般有如下三个步骤:

  1.  定义异常类,继承Exception类或RuntimeException类。
  2. 编写异常类的构造方法,并继承父类的实现。常见的构造方法有四种形式,可根据需求选择添加实现。构造方法如下所示:

 

3.日志框架Log4j 2

1.java中的日志框架

程序在开发完成后会被不同系统环境的用户使用,在使用过程中可能会出现各类异常,程序出现的技术错误信息是提供开发人员定位问题并解决问题。将这些信息直接展示给用户看是没有任何意义的。这时可以将用户执行的所有操作和程序运行的过程记录到日志中,开发人员可以通过分拆日志内容,快速定位并诊断问题。

综上所述,对于一个应用程序来说,日志记录是必不可少的。它类似生活中的日记,可以用来记录用户操作、系统支持状态等,是一个系统的重要组成部分。日志的主要用途如下。

  • 问题追踪:辅助排查和定位问题,代码程序运行性能。
  • 状态监控:通过日志分折,可以监控系统的运行性能。
  • 安全审计:主要体现在安全上,可以发现非授权操作。 java中存在多种日志框架,目前常用的日志框架包括以下几种。
  • Log4j:ApacheLog4j是基于java的日志记录工具,现在是Apache软件基金会的一个项目。Log4j是几种java日志框架之一。
  • CommonsLogging:Apache基金会所属的项目,是一套java日志接口。
  • SLF4J:类似于CommonsLogging,是一套简易java日志门面,本身并无日志的实现。
  • Logback:一套日志组件的实现(属于SLF4J阵营)。
  • JUL(Java UtilLogging):自java1.4以来的官方日志实现。
  • Log4j2:Apache重写Log4j 1.x,成立新的项目Log4j2.Log4j2是Apache开发的一款升级产品。

2.记录日志 

Logger类可供开发人员记录日志信息,它提供了一系列方法来输出不同级别的日志信息,Logger类常用的日志记录方法如下表:

 

 log4j2.xml配置文件的各节点及其属性如下表:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值