JavaSE(三)异常处理

错误处理

Java的异常

Java使用异常Exception来表示错误
	1)Exception是Class,带有类型信息
	2)可以在任何地方抛出
	3)只需要在上层捕获,和方法调用分离

在这里插入图片描述

必须捕获的异常称为Checked Exception
不必须捕获的异常包括 RuntimeException 和 Error 及其子类
捕获异常使用 try ... catch
不捕获的Checked Exception必须用throws声明
mian()是最后捕获异常的机会

捕获异常

捕获异常使用 try ... catch
catch会捕获对应的Exception及其子类
多个catch字句从上到下匹配,所以顺序非常重要,子类必须在前
finally保证有无错误都会执行
finally可选
使用multi-catch捕获多种类型异常(JDK >= 1.7)
	如果某些异常的处理逻辑相同,不存在继承关系,必须编写多条catch子句,可以用“|”表示多种Exception

抛出异常

异常从下往上抛出,直至被捕获
打印方法调用栈:printStackTrace()
用throw语句抛出异常
转换异常时注意保留原始异常信息
抛出异常前会保证执行finally
finally如果抛出异常会导致suppressed exception
获取所有异常信息:getSuppressed()

如何保存所有的异常信息?

1)用origin变量保存原始异常
2)如果存在原始异常,用addSupperssed()添加新异常
3)如果存在原始异常,或者新异常,最后在finally抛出
Exception orgin = null;
try {
	// process1("");
} catch (Exception e) {
	orgin = e;
	throw new RuntimeException(e);
} finally {
	try {
		throw new NullPointerException();
	} catch (Exception e) {
		if (orgin != null) {
			orgin.addSuppressed(e);
		} else {
			orgin = e;
		}
	}
	if (orgin != null) {
		throw orgin;
	}
}
try {
	// somethingWrong("");
} catch (Exception e) {
	e.printStackTrace();
	for(Throwable t : e.getSuppressed()){
		t.printStackTrace();
	}
}

自定义异常

尽量使用JDK已定义异常
可以定义新的异常类型:
	1)从适合的Exception派生
	2)从RuntimeException派生
先定义BaseException(从适合的Exception派生),再派生子类
自定义异常应该提供多个构造方法
可以使用IDE根据父类快速创建构造方法

断言和日志

使用断言 Assertion

断言使用assert语句
JVM默认关闭断言指令
	1)给Java虚拟机传递 -ea 参数启用断言
	2)可以指定特定的类启用断言 -ea:com.feiyangedu.sample.Main
	3)可以指定特殊的包启用断言 -ea:com.feiyangedu
特点:
	1)断言是一种调试方式,断言失败会抛出AssertionError导致程序退出
	2)只能在开发和测试阶段启用断言
	3)对可恢复的错误不能使用断言,而应该抛出异常
	4)断言很少被使用,更好的方法是编写单元测试

使用JDK Logging

日志Logging
	1)日志是为了替代 System.out.println(),可以定义格式,重定向到文件等
	2)日志可以存档,便于追踪问题
	3)日志记录可以按级别分类,便于打开或关闭某些级别
	4)可以根据配置文件调整日志,无需修改代码
JDK提供了Logging:java.util.logging(JDK>=1.4)
Logger logger = Logger.getGlobal();
logger.info("start...");
logger.log(Level.WARNING, "warning");
logger.warning("start...");
JDK Logging定义了7个日志级别
	1)SEVERE
	2)WARNING
	3)INFO(默认级别)
	4)CONFIG
	5)FINE
	6)FINER
	7)FINEST
JDK Logging的局限:
	JVM启动时读取配置文件并完成初始化
	JVM启动后无法修改配置
	需要在JVM启动时传递参数 -Djava.util.logging.config.file=config-file-name

使用Commons Logging

Commons Logging是Apache创建的日志系统
	可以挂载不同的日志系统,可以通过配置文件指定挂接的日志系统,
	自动搜索并使用Log4j,使用JDK Logging(JDK >= 1.4)
	1)Commons Logging是使用最广泛的日志模板
	2)Commons Logging的API非常简单
	3)Commons Logging可以自动使用其他日志模板
Commons Logging定义了6个日志级别
	1)FATAL
	2)ERROR
	3)WARNING
	4)INFO(默认级别)
	5)DEBUG
	6)TRACE
在Eclipse中引入jar包
	Project ==> Property ==> Java Build Path ==> Libraries ==> Add Jars ...
	初始化Log对象:
		final Log log = LogFactory.getLog(getClass());
文档:http://commons.apache.org/proper/commons-logging/

使用Log4j

Log4j的概念:
	1)Appender
	2)Filter:过滤日志输出
	3)Layout:格式化日志输出

在这里插入图片描述

使用log4j:
	1)通过Commons Logging实现日志,不需要修改代码即可使用Log4j
	2)使用Log4j只需要把Log4j2.xml和相关jar放入classpath
	3)如果要更换Log4j,只需要移除Log4j2.xml和相关jar
	4)只有扩展Log4j时,才需要引入Log4j的接口
文档:https://logging.apache.org/log4j/2.x/

猜你喜欢

转载自blog.csdn.net/yangwei234/article/details/84970489