异常管理 - Java异常处理分析 (Unchecked Exception VS Checked Exception)

Java异常指定是程序在运行过程中出现错误或异常, 超出程序处理范围, 一旦出现异常, 如果不处理, 就没有必要继续运行下去, JAVA有两种类型的异常

  • 检查异常 (Checked Exception)
检查异常类继承java.lang.Exception, 必须明确的捕获(Caught)或propagated(传播), 需要显示的调用try-catch-finally 或 throws.
例如: FileNotFoundExceptionIOException
try-catch-finally
public void readFile(){
	try {
		FileInputStream input= new FileInputStream(new File("D://test.txt"));
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}
}
throws
public void readFile() throws FileNotFoundException{
	FileInputStream input = new FileInputStream(new File("D://test.txt"));;
}


  • 未检查异常 (Unchecked Exception)
未检查异常类继承java.lang.RuntimeException, 无需显示的捕获(Caught)或propagated(传播), 例如:NullPointerException , InvalidArgumentException

检查异常和未检查异常最终功能上都是一样的, 检查异常可以处理的未检查异常也可以处理,于要使用哪种异常类型可以根据实际情况, 但是建议整个程序保持一致, 要么使用检查异常, 要么都使用未检查异常, 对于检查异常 (Checked Exception)与未检查异常 (Unchecked Exception)两个哪个比较好的问题, 网上有不同的见解:

  • 支持Checked Exception的人认为

  1. 使用checked Exception需要编译器强制捕获或抛出某个异常, 这样开发者就不会遗忘, 而Unchecked Exception则不需要, 出现漏处理的问题.

  2. Unchecked Exception通常会在最顶级进行捕获处理, 这样如果异常是最底层抛出, 就不容易定位错误位置, 不容易排查问题.

  • 支持Unchecked Exception的人认为

  1. 使用Unchecked Exception可以让代码显得简洁, 如果代码到处充斥着try-catch会让人感觉混乱, 影响代码阅读,  并且大多情况下对checked Exception都只是简单处理或干脆就直接throw, 所以没多大必要, 就像标准的Java API 很多也是用的是Unchecked Exception就比如说: NullPointerException , InvalidArgumentException.

  2. Checked Exception异常如果throw方式处理异常会影响接口的稳定性, 一旦增加抛出或修改异常类型, 调用方法就必须重新捕获或修改, Unchecked Exception可以不需要显示捕获和抛出, 可以保证接口的稳定性.
我的观点是使用Unchecked Exception, 在我实际开发中, 异常的处理往往都只是try-catch然后throw, 然后由调用它的顶级方法进行处理, 所以没必要使用 Checked Exception, 另外我们通常会异常进行统一管理, 我们通常会自定义异常类, 这样就避免了异常信息混乱, 不易排查的问题.

自定义异常类可以统一管理异常, 不需要对每个异常类进行单独处理, 比如在一些场景中, 顶级方法会调用一堆的方法, 在这一堆的方法中会分别抛出各种各样的异常, 这时顶级方法就必须对这些方法进行捕获, 这时就要指定捕获的类型, 一旦子方法抛出的异常类型变动, 就需要修改顶级方法. 例如: 顶级方法调用Dao层的方法, 开始Dao持久化的数据时保存在数据库, 这时就可能抛出的异常类型是SQLException, 如果想把数据保存在xml 文件时, 可能抛出的异常就会变为IOException, 如果顶级方法开始捕获的是SQLException, 现在就必须改为 IOException.

为了解决这个问题, 一般会自定义一个异常, 例如DaoException.java, 一旦Dao层出现异常, 就对异常进行捕获, 并将异常统一转化成为DaoException抛出:

 try{
        dao.getPersion();
    } catch (SQLException sqlException) {
        throw new DaoException("error text", sqlException);
}

DaoException.java

public class DaoException extends RuntimeException {
	private static final long serialVersionUID = 8328325784637321672L;
	

	public DaoException() {
		super();
	}

	public DaoException(String message, Throwable cause) {
		super(message, cause);
	}

	public DaoException(String message) {
		super(message);
	}

	public DaoException(Throwable cause) {
		super(cause);
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值