广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Java自定义异常与异常使用的最佳方式
  • 927
分享到

Java自定义异常与异常使用的最佳方式

Java异常自定义异常异常使用 2019-09-12 08:09:53 927人浏览 无得
摘要

目录异常的分类1. 非运行时异常(Checked Exception)2. 运行时异常(Runtime Exception/Unchecked Exception)异常的处理一、对应非运行时异常,必须对其进行处理二、对于运行时异常,可以不对

目录
  • 异常的分类
    • 1. 非运行时异常(Checked Exception)
    • 2. 运行时异常(Runtime Exception/Unchecked Exception)
  • 异常的处理
    • 一、对应非运行时异常,必须对其进行处理
    • 二、对于运行时异常,可以不对其进行处理
  • 应用场景
    • 自定义异常类过程
      • 1. 多数情况下
        • 扩展
      • 2. 声明方法抛出自定义异常
        • 3.自定义异常测试操作
        • 使用异常的最佳实践
          • 1. 记得释放资源
            • 2. 不要使用异常作控制流程之用
              • 3. 不要忽略异常
                • 4. 不要 catch 最高层次的 exception
                  • 5. 仅记录 exception 一次
                  • 总结

                    异常的分类

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

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

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

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

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

                    异常的处理

                    一、对应非运行时异常,必须对其进行处理

                    处理方式有两种:

                    • 使用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值,事先必须有具体的规定或说明。

                    
                    
                    public class CustomerException extends RuntimeException {
                     
                    	private String retCd ;  //异常对应的返回码
                    	private String msgDes;  //异常对应的描述信息	
                    	public CustomerException() {
                    		super();
                    	}
                     
                    	public CustomerException(String message) {
                    		super(message);
                    		msgDes = message;
                    	}
                     
                    	public CustomerException(String retCd, String msgDes) {
                    		super();
                    		this.retCd = retCd;
                    		this.msgDes = msgDes;
                    	}
                     
                    	public String getRetCd() {
                    		return retCd;
                    	}
                     
                    	public String getMsgDes() {
                    		return msgDes;
                    	}
                    }

                    2. 声明方法抛出自定义异常

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

                    
                    public class TestClass { 
                     public void testException() throws CustomerException {
                      try {
                    <p>   //..some code that throws <span style="font-family:SimSun;">CustomerException</span></p>  } catch (Exception e) {
                       throw new CustomerException("14000001", "String[] strs's length < 4");
                      }
                     }
                    }

                    3.自定义异常测试操作

                    
                    public class TestCustomerException { 
                     public static void main(String[] args) { 
                      try {
                       TestClass testClass = new TestClass();
                       testClass.testException();
                      } catch (CustomerException e) {
                       e.printStackTrace();
                       System.out.println("MsgDes\t"+e.getMsgDes());
                       System.out.println("RetCd\t"+e.getRetCd());
                      }
                     }
                    }

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

                    使用异常的最佳实践

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

                    1. 记得释放资源

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

                    
                    public void dataAccessCode (){
                        Connection conn = null;
                        try{
                            conn = getConnection ();
                            ..some code that throws sqlException
                        }catch(SQLException ex){
                            ex.printStacktrace ();
                        } finally{
                            DBUtil.closeConnection (conn);
                        }
                    }
                     class DBUtil{
                        public static void closeConnection
                            (Connection conn){
                            try{
                                conn.close ();
                            } catch(SQLException ex){
                                logger.error ("Cannot close connection");
                                throw new RuntimeException (ex);
                            }
                        }
                    }

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

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

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

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

                    
                    public void useExceptionsForFlowControl () {
                        try {
                            while (true) {
                                increaseCount ();
                            }
                        } catch (MaximumCountReachedException ex) {
                        }
                        //Continue execution }
                     public void increaseCount ()
                        throws MaximumCountReachedException {
                        if (count >= 5000)
                            throw new MaximumCountReachedException ();
                    }

                    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 的激烈争论。你可以根据你的需要来设计代码。我相信,随着时间的推移,我们会找到些更好的异常处理的方法的。

                    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程界.

                    --结束END--

                    本文标题: Java自定义异常与异常使用的最佳方式

                    本文链接: https://www.lsjlt.com/news/70.html(转载时请注明来源链接)

                    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

                    本篇文章演示代码以及资料文档资料下载

                    下载Word文档到电脑,方便收藏和打印~

                    下载Word文档
                    猜你喜欢
                    • Java自定义异常与异常使用的最佳方式
                      目录异常的分类1. 非运行时异常(Checked Exception)2. 运行时异常(Runtime Exception/Unchecked Exception)异常的处理一、对应非运行时异常,必须对其进行处理二、对于运行时异常,可以不对...
                      99+
                      2019-09-12
                      Java异常 自定义异常 异常使用
                    • SpringMVC 异常处理机制与自定义异常处理方式
                      目录SpringMVC默认处理的几种异常@ResponseStatus异常处理的顺序自定义异常类(SpringMVC的异常处理)①:自定义异常类②:自定义异常处理器③:配置我们的异常...
                      99+
                      2022-11-12
                    • Java中的自定义异常捕获方式
                      目录Java 自定义异常捕获自定义异常类格式如下:自定义异常类的调用格式如下:可能出现异常的代码写法如下:本题完整代码如下:自定义异常Exception根据业务需要不用的异常打印不用类型的日志Java 自定义异常捕获 编写一个程序,将字符串...
                      99+
                      2016-05-06
                      Java异常 自定义异常 异常捕获
                    • SpringMVC异常处理机制与自定义异常处理方式的示例分析
                      这篇文章主要介绍SpringMVC异常处理机制与自定义异常处理方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!提到异常处理,就不得不提HandlerExceptionResolvers,我们的Dispat...
                      99+
                      2023-06-25
                    • 浅谈几种Java自定义异常处理方式
                      目录自定义异常类错误编码处理断言处理应用日志处理异常消息模板和格式化处理总结在Java中,异常是一种常见的处理机制。当程序运行出现错误时,Java会默认抛出一个异常,并通过栈回溯信息...
                      99+
                      2023-05-19
                      Java自定义异常 Java 异常
                    • Java自定义异常的方法是什么
                      本文小编为大家详细介绍“Java自定义异常的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java自定义异常的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、异常分为哪几种异常分为两种,分...
                      99+
                      2023-07-06
                    • Java异常--常见方法--自定义异常--增强try(try-with-resources)详解
                      目录异常方法自定义异常作用定义增强try(try-with-resources)作用条件jdk7jdk9异常方法 //返回此可抛出对象的详细信息消息字符串 public String...
                      99+
                      2023-03-14
                      java自定义异常 java增强try java try-with-resources
                    • 使用Java如何实现异常自定义
                      今天就跟大家聊聊有关使用Java如何实现异常自定义,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体代码如下所示: class ChushulingException ext...
                      99+
                      2023-05-31
                      java 自定义异常 ava
                    • Java中的异常类怎么实现自定义
                      Java中的异常类怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常...
                      99+
                      2023-05-31
                      java ava
                    • python中如何使用自定义异常类
                      本篇文章为大家展示了python中如何使用自定义异常类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自定义异常类自定义类继承系统的异常基类exception自定义异常类的构造函数等方法进行处理举例:...
                      99+
                      2023-06-20
                    • dubbo自定义异常的完整步骤与测试
                      目录前言操作步骤一、创建一个公共的用于处理异常的工程二、生产端配置文件改造 三、消费端配置测试1、启动本地的zk服务2、启动生产端服务3、启动消费端服务模拟服务调用使用场景...
                      99+
                      2022-11-13
                    • shiro与spring security用自定义异常处理401错误
                      目录shiro与spring security自定义异常处理401背景解决方案SpringBoot整合Shiro自定义filter报错No SecurityManager acces...
                      99+
                      2022-11-12
                    • SpringBoot之自定义启动异常堆栈信息打印方式
                      在SpringBoot项目启动过程中,当一些配置或者其他错误信息会有一些的规范的提示信息 *************************** APPLICATION FAILE...
                      99+
                      2022-11-12
                    • python用户自定义异常的示例分析
                      这篇文章主要介绍了python用户自定义异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说明程序可以通过创建一个新的异常类来命名它们自己的异常。异常应该是典型的继...
                      99+
                      2023-06-20
                    • python用户自定义异常的实例讲解
                      说明 程序可以通过创建一个新的异常类来命名它们自己的异常。异常应该是典型的继承自Exception类,直接或间接的方式。 异常python有一个大基类,继承了Exception。因此,我们的定制类也必须继承Excep...
                      99+
                      2022-06-02
                      python 自定义 异常
                    • ASP.NET MVC自定义异常过滤器使用案例
                      目录一、需求二、案例1、创建工具类1.1、创建日志工具类1.2、创建网络工具类2、创建自定义异常类3、创建控制器4、测试在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真...
                      99+
                      2022-11-13
                    • 详解在Python程序中自定义异常的方法
                      通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。 以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeE...
                      99+
                      2022-06-04
                      自定义 详解 异常
                    • Java构造方法 super 及自定义异常throw合集详解用法
                      1.构造方法: public 类名(){} 区别一下 // public void 方法名(){} 分为有参,无参子类构造方法 public class Zi extends f...
                      99+
                      2022-11-12
                    • shiro与spring security怎么用自定义异常处理401错误
                      这篇文章主要介绍shiro与spring security怎么用自定义异常处理401错误,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!shiro与spring security自定义异常处理401背景现在是...
                      99+
                      2023-06-21
                    • 如何使用python写一段自定义异常代码
                      这篇文章主要为大家展示了“如何使用python写一段自定义异常代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用python写一段自定义异常代码”这篇文...
                      99+
                      2022-10-19
                    软考高级职称资格查询
                    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
                    • 官方手机版

                    • 微信公众号

                    • 商务合作