java异常处理

##友好的异常处理
程序使用 try…catch 进行整段代码的包括,输出了相应的错误日志,如果不是最外层调用则 catch 里不打印堆栈信息,并且 throws 了自定义异常,同时把堆栈信息带出去,最外层调用方,根据自定义异常,选择友好的提示信息给用户展示,并且打印出异常的堆栈信息。即程序根据实际情况对异常进行了综合处理,并通过日志进行了异常的详细记录,以便核查问题。

##异常处理有哪些原则
三大原则
程序层面异常处理原则

  • 避免异常处理代替错误处理;
    有的人写代码会用异常处理来做判断逻辑或者做业务逻辑处理,这样会降低程序的清晰性,并且效率低下。
  • 处理异常不可以代替简单测试,只能在异常情况下使用异常机制;
  • 不要进行小粒度的异常处理,应该将整个业务代码包装在一个try语句块中;
  • 异常往往在高层处理,且不能忽视任何一个异常;

需求层面异常处理原则

  1. 程序员不定义业务异常流程
    业务需求是通过代码来实现的,程序员一般不了解业务,因此在写某个业务需求过程中,发现处理不了的异常,一定要与客户或者产品负责人来确定异常流程,从业务逻辑层面,考虑异常处理的业务逻辑,程序员不去定义业务异常流程。
  2. 给用户友好的提示
    在发现异常情况后,代码进行特殊处理后,给用户友好的提示,不能直接抛出异常到用户界面。

接口层面异常处理原则

  1. 输入、输出参数校验
    接口服务提供方一般要对输入参数做校验,校验通过后,才会提供服务。接口调用方一般要对输出参数做校验,校验通过后,才会使用服务。
  2. 请求和响应的日志记录
    接口要对请求和响应做好日志记录,这在后期遇到问题反查的时候特别重要。
  3. 接口超时等异常的业务处理
    接口开发时,经常会遇到接口超时等网络问题,因此在开发的过程中,尤其要处理好这些异常。比如:超时反查机制,超时重发机制等。

##Java 异常处理机制介绍

所有的异常跟错误都继承于 Throwable 类,也就是说所有的异常都是一个对象。Exception 类是 Throwable 类的子类,除了 Exception 类外,Throwable 还有一个子类 Error 。

###Error(错误)
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在 Java 程序处理的范畴之外。Error 用来指示运行时环境发生的错误。

例如:JVM 运行时出现的 OutOfMemoryError 以及 Socket 编程时出现的端口占用等程序无法处理的错误。程序一般不会从错误中恢复。

###Exception(异常)

  1. 运行时异常(RuntimeException 及其之类的异常)

此类异常代码编写的时候不会被编译器所检测出来,是可以不需要被捕获即可以不处理,但是我们可以编写代码处理(使用 try…catch…finally)这样的异常。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理,这样的异常发生的原因多半是代码写的有问题(一般的做法是进行判断后处理)。
常见的 RUNtimeException 有:NullpointException(空指针异常)、ClassCastException(类型转换异常)、IndexOutOfBoundsException(数组越界异常)等。

  1. 编译异常(RuntimeException 以外的异常)

这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。在方法中要么用 try…catch 语句捕获它并处理,要么用 throws 子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。
常见编译异常有:IOException(流传输异常)、SQLException(数据库操作异常)等。

###Java处理异常的机制
异常总是先被抛出,后被捕捉的

  1. 抛出异常
  2. 捕获异常

##异常处理对项目质量的影响

  1. 空指针异常

NPE是Java程序员最不能忍受的异常,如果NPE没处理好展示到用户的眼里,那么他可能是个假的程序员。
NPE的处理很简单,就是在使用一个对象的时候,记得加一层非空判断

	/**
	 * 用户自定义异常
	 */
	public class MyException extends RuntimeException {
	/**
	 * 错误码
	 */
	private String errorCode;
	
	/**
	 * 错误原因
	 */
	private String errorMsg;
	
	/**
	 * 错误原因枚举
	 */
	private ResultCodeEnum resultCodeEnum;
	
	/**
	 * 构造器
	 *
	 * @param resultCodeEnum
	 */
	public MyException(ResultCodeEnum resultCodeEnum) {
	    super();
	    this.errorCode = resultCodeEnum.getCode();
	    this.errorMsg = resultCodeEnum.getDesc();
	}
	
	public MyException(String errorCode, String errorMsg) {
	    super();
	    this.errorCode = errorCode;
	    this.errorMsg = errorMsg;
	}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值