1.异常的分类

1. 非运行时异常(Checked Exception)

Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。

2. 运行时异常(Runtime Exception/Unchecked Exception)

RuntimeException类直接继承自Exception类,称为运行时异常。

Java中所有的运行时异常都直接或间接的继承自RuntimeException。

Java中所有的异常类都直接或间接的继承自Exception。

2.异常的处理

一、对应非运行时异常,必须对其进行处理。处理方式有两种:

使用try…catch…finally语句块进行捕获

在产生异常的方法所在的方法声明throws Exception

二、对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。

在使用Java API的方法时会产生异常,由于实际的需要,我们需要创建和使用自定义异常。使用全新的异常类,应用到系统程序中。

在介绍自定义异常时,首要先谈谈什么要使用自定义异常,使用自定义异常的好处。创建自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新的含义;可以显示代码多个位置之间的错误的相似处,也可区分代码运行时可能出现的相似问题的一个或多个错误,或给出应用程序中一组错误的特殊含义。

应用场景

服务器的基本作用是处理与客户机的通信,若使用标准Java API(如java.io和java.net包中的类)来编写服务器,则可使编写的代码在多个位置抛出IOException。在设置服务器、等待客户机连接和获取通讯流时,可抛出IOException,在通信期间及试图断开连接时,也会抛出IOException。简而言之,服务器的各个部分都是引发IOException。

对于服务器而言,这样IOException意义不尽相同。虽然由同一异常类型表示,但与各个异常先关的业务含义存在差异,报告和恢复操作也不相同。所以,可以将一个异常集与服务器配置和启动问题关联,将另一个异常集与客户机通讯的实际行动关联,将第三个异常集与服务器关闭任务关联。使用自定义异常,可采用对应用程序有意义的方式来灵活地表示错误。

为此,我们需要使用自定义异常来定为问题,定位问题与异常实际准确的位置。

自定义异常类过程

1. 多数情况下,只需要继承异常类Exception, 经常需要定义一个或多个构造函数,以在对象中存储错误消息。

扩展:

类java.lang.Throwable是所有异常类的基类,它包括两个子类:Exception和Error,Exception类用于描述程序能够捕获的异常,如ClassNotFoundException。Error类用于指示合理的应用程序不应该试图捕获的严重问题,如虚拟机错误VirtualMachineError

自定义异常类可以继承Throwable类或者Exception类,而不要继承Error类。自定义异常类之间也可以有继承关系

需要为自定义异常类设计构造方法,以方便构造自定义异常对象。

在继承任何异常时,将自动继承Throwable类的一些标准特性,如:

错误消息

栈跟踪

异常包装

若要在异常中添加附加信息,则可以为类添加一些变量和方法。本例演示的自定义异常没有按照业务类型来命名,而是创建一个通用异常类,以retCd来区别发生异常的业务类型与发生位置,当然对于具体的retCd值,事先必须有具体的规定或说明。

package com.example.exception;

import lombok.Getter;

/**

* 多数情况下,创建自定义异常需要继承Exception,本例继承Exception的子类RuntimeException

* @author: GuanBin

* @date: Created in 上午11:39 2019/5/22

*/@Getter

public classCustomerException extends RuntimeException {

private String resultCode; //异常对应的返回码

private String messageDescription; //异常对应的描述信息

publicCustomerException (){

super();

}

publicCustomerException (String massage){

super(massage);

messageDescription=massage;

}

publicCustomerException (String massage,String resultCode){

super();

this.resultCode=resultCode;

this.messageDescription=massage;

}

}

2. 声明方法抛出自定义异常。为了使用自定义异常,必须通知调用代码的类:要准备处理这个异常类型。为此,声明一个或多个方法抛出异常。找到异常发生点,新建异常并加上关键字throw。

package com.example.java8test.exception;

import com.example.exception.CustomerException;

/**

* @author: GuanBin

* @date: Created in 上午11:46 2019/5/22

*/

public classexceptionTest {

public static voidmain(String[] args) {

try{

testException();

} catch(CustomerException e) {

e.printStackTrace();

System.out.println("MsgDes\t" +e.getMessageDescription());

System.out.println("RetCd\t" +e.getResultCode());

}

}

public static voidtestException() throws CustomerException{

throw new CustomerException("10","String[] strs's length < 4");

}

}

以下的自定义异常的最佳实践,摘自网络,经过参考扩展使用。

使用异常的最佳实践

下面的部分我们列出了客户端代码处理 API 抛出异常的一些最佳实现方法。

1. 记得释放资源

如果你正在用数据库或网络连接的资源,要记得释放它们。如果你使用的 API 仅仅使用 unchecked exception,你应该用完后释放它们,使用 try-final。

1 public voiddataAccessCode() {

2 Connection conn = null;

3 try{

4 conn =getConnection();

5 //..some code that throws SQLException

6 } catch(SQLException ex) {

7 ex.printStacktrace();

8 } finally{

9 DBUtil.closeConnection(conn);

10 }

11 }

12

13 classDBUtil {

14 public static voidcloseConnection

15 (Connection conn) {

16 try{

17 conn.close();

18 } catch(SQLException ex) {

19 logger.error("Cannot close connection");

20 throw newRuntimeException(ex);

21 }

22 }

23 }

DBUtil 是一个关闭连接的工具类。最重要的部分在于 finally,无论异常发不发生都会执行。在这个例子中,finally 关闭了连接,如果关闭过程中有问题发生的话,会抛出一个 RuntimeException。

2. 不要使用异常作控制流程之用

生成栈回溯是非常昂贵的,栈回溯的价值是在于调试。在流程控制中,栈回溯是应该避免的,因为客户端仅仅想知道如何继续。

下面的代码,一个自定义的异常 MaximumCountReachedException,用来控制流程。

1 public voiduseExceptionsForFlowControl() {

2 try{

3 while (true) {

4 increaseCount();

5 }

6 } catch(MaximumCountReachedException ex) {

7 }

8 //Continue execution }

9 public voidincreaseCount ()throws MaximumCountReachedException {

10 if (count >= 5000)

11 throw newMaximumCountReachedException();

12 }

useExceptionsForFlowControl()使用了一个无限的循环来递增计数器,直至异常被抛出。这样写不仅降低了代码的可读性,也让代码变得很慢。记住异常仅用在有异常发生的情况。

3. 不要忽略异常

当一个 API 方法抛出 checked exception 时,它是要试图告诉你你需要采取某些行动处理它。如果它对你来说没什么意义,不要犹豫,直接转换成 unchecked exception 抛出,千万不要仅仅用空的{}catch 它,然后当没事发生一样忽略它。

4. 不要 catch 最高层次的 exception

Unchecked exception 是继承自 RuntimeException 类的,而 RuntimeException 继承自 Exception。如果 catch Exception 的话,你也会 catch RuntimeException。

try{

..

}catch(Exception ex){

}

上面的代码会忽略掉 unchecked exception。

5. 仅记录 exception 一次

对同一个错误的栈回溯(stack trace)记录多次的话,会让程序员搞不清楚错误的原始来源。所以仅仅记录一次就够了。

总结:这里是我总结出的一些异常处理最佳实施方法。我并不想引起关于 checked exception 和 unchecked exception 的激烈争论。你可以根据你的需要来设计代码。我相信,随着时间的推移,我们会找到些更好的异常处理的方法的。

java 自定义错误代码_Java 自定义异常(转载)相关推荐

  1. java 自定义错误代码_JAVA自定义异常

    创建自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义. 可区分代码运行时可能出现的相似问题的一个或多个错误,或给出应用程序中一组错误的特定含义. //自定义异常类需 ...

  2. java 自定义运算符_Java中集合的自定义运算符

    java 自定义运算符 总览 操作员重载有多种语言可用. Java对String类型的+运算符的支持对运算符的重载非常有限. 我们可以利用其他语言支持运算符的不同方式,但是我们可以在Java中实现一个 ...

  3. java自定义序列化_Java中的自定义国际化(i18n)

    java自定义序列化 国际化(i18n)在我们的软件项目中非常重要. 它主要带来以下好处: 将UI字符串外部化为代码文件以外的外部文件,以及易于管理的UI内容. 支持多种语言. 在这篇文章中,将为Ec ...

  4. java 自定义标签_Java自定义标签用法实例分析

    本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...

  5. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  6. java 自定义 转换器_Java笔记之SpringMVC(七):自定义String到Date的类型转换器

    0.说在前面 1.新建converter.jsp 转换器页面 日期: 提交 ${converteredDate } 2.新建ConverterController类 packagecom.spring ...

  7. java 自定义注解_Java注解

    前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...

  8. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

  9. java自定义数组_Java自定义数组

    前言 今天有点无聊,写了一个自定义数组,里边主要实现很多js中数组的方法,例如:排序.数组连接.删除.剪切.算是加深对java的一些基础操作的印象. 代码/** * @Auther dbc * @Da ...

最新文章

  1. GDI+ 学习记录(3): 虚线画笔 - Dash
  2. linux 搭建 lamp环境搭建,Worktile官方博客,分享企业协作的技巧、工具和实践
  3. 百度是如何收录没有提交过的新站
  4. Unity --- MeshRenderer之网格合并
  5. LDAP命令介绍---dsreplication
  6. 在线PS(PhotoShop),打开PSD文件,图像处理
  7. .NET 文件相关的所有操作
  8. win7主题文件夹背景破解
  9. CISSP考试认证心得
  10. Go优雅的重启服务之endless库
  11. 电子宠物游戏(附C++源码)
  12. Aluminium cold plate
  13. 普通路由器改4g路由器_4G工业路由器将加速工业物联网发展进程
  14. php判断图片有没有ps过,你知道你PS过的图片会侵犯别人的权利吗?
  15. npm安装依赖报错 unable to resolve dependency tree....
  16. 美国计算机视觉专业排名,你了解美国计算机视觉专业吗
  17. 类unix系统中启动脚本记录
  18. 传感器原理及应用期末复习汇总(附某高校期末真题试卷)
  19. 用HTML写一首绝句古诗,杜甫最早的一首绝句,写出诗仙傲岸狂放的诗仙本色
  20. netty5拆包问题解决实例

热门文章

  1. 考研APP软件开发实现功能
  2. 凤凰雪茶成为凤凰县推动村级集体经济发展的新引擎
  3. Kindle推送教程:推送Kindle 电子书详细步骤
  4. Ceph作为Hadoop分布式文件系统的可扩展替代方案
  5. 如何在unity中debug调试打包到VR头显的应用代码
  6. linux的内核设计,Linux内核设计的艺术 清晰完整版PDF+配套源码
  7. 让你成功赚钱,最有效的办法!
  8. I/O error on POST request for “http://localhost:9999/api/v2/spans“: connect timed out; nested except
  9. teamviewer早期版本11-14 版 官方链接地址
  10. 前端vue面试总结,常见的,没有更全,只有更细,更新中