Java 自定义异常(转载)

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 class CustomerException extends RuntimeException {private String resultCode; //异常对应的返回码private String messageDescription; //异常对应的描述信息public CustomerException (){super();}public CustomerException (String massage){super(massage);messageDescription=massage; } public CustomerException (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 class exceptionTest {public static void main(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 void testException() throws CustomerException{ throw new CustomerException("10","String[] strs's length < 4"); } }

 

以下的自定义异常的最佳实践,摘自网络,经过参考扩展使用。
使用异常的最佳实践
  下面的部分我们列出了客户端代码处理 API 抛出异常的一些最佳实现方法。
  1. 记得释放资源
  如果你正在用数据库或网络连接的资源,要记得释放它们。如果你使用的 API 仅仅使用 unchecked exception,你应该用完后释放它们,使用 try-final。

 1     public void dataAccessCode() {2         Connection conn = null;3         try {4             conn = getConnection();5             //..some code that throws SQLException6         } catch (SQLException ex) {7  ex.printStacktrace(); 8 } finally { 9  DBUtil.closeConnection(conn); 10  } 11  } 12 13 class DBUtil { 14 public static void closeConnection 15  (Connection conn) { 16 try { 17  conn.close(); 18 } catch (SQLException ex) { 19 logger.error("Cannot close connection"); 20 throw new RuntimeException(ex); 21  } 22  } 23 }

 

DBUtil 是一个关闭连接的工具类。最重要的部分在于 finally,无论异常发不发生都会执行。在这个例子中,finally 关闭了连接,如果关闭过程中有问题发生的话,会抛出一个 RuntimeException。
  2. 不要使用异常作控制流程之用
  生成栈回溯是非常昂贵的,栈回溯的价值是在于调试。在流程控制中,栈回溯是应该避免的,因为客户端仅仅想知道如何继续。
  下面的代码,一个自定义的异常 MaximumCountReachedException,用来控制流程。

 1   public void useExceptionsForFlowControl() {2         try {3             while (true) {4                 increaseCount();5             }6         } catch (MaximumCountReachedException ex) { 7  } 8 //Continue execution } 9 public void increaseCount ()throws MaximumCountReachedException { 10 if (count >= 5000) 11 throw new MaximumCountReachedException(); 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 的激烈争论。你可以根据你的需要来设计代码。我相信,随着时间的推移,我们会找到些更好的异常处理的方法的。

转载自:https://blog.csdn.net/mahoking/article/details/45064259

转载于:https://www.cnblogs.com/guanbin-529/p/10905445.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将markdown转换为wxml

话说我要为技术博客写一个小程序版&#xff0c;我的博客解决方案是 hexo github-page&#xff0c;格式当然是技术控们喜欢的 markdown 了 。但小程序使用的却是独有的模版语言 WXML。我总不能把之前的文章手动转换成小程序的 wxml 格式吧&#xff0c;而网上也没完善的转换库&a…

巧妙喝水打败多种疾病

喝水&#xff0c;我们每天都会做的一件事&#xff0c;殊不知&#xff0c;喝水得当能打败多种疾病问题! 方法/步骤 一、很多人都听说过早晨喝一杯水对身体有好处&#xff0c;有人喝盐水?有人喝蜂蜜水?还有人为了美白喝柠檬水?到底喝什么水最好呢?人体经过了一宿的代谢&…

git 几个commit点合并成一个commit点

在用git做版本控制器的时候&#xff0c;经常会遇到以下情况&#xff1a; 1、在做1个功能的时候&#xff0c;你自己觉得代码没问题了&#xff0c;就本地commit&#xff0c;然后提交代码&#xff0c;在gitlab上发起和并请求&#xff0c;老大看完之后&#xff0c;觉得你还有修改的…

JNDI 是什么

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 JNDI : 简单理解&#xff0c;就是把固定的连接方式剥离出来&#xff0c;单独写在一个配置文件里。(下载.properties里面通过InputStream…

并发编程模型

并发编程模型 一.分类 按照线程通信机制可以分为共享内存模型和消息传递模型&#xff1a; 1.共享内存模型&#xff1a;线程之间共享程序的公共状态&#xff0c;编程之间通过读写内存中的公共状态来隐式进行通信。相互通信的进程共享某些数据结构或共享存储区&#xff0c;进程通…

换工作,让我里外不是人,到底错在哪儿

看看时间&#xff0c;现在是凌晨4点多&#xff0c;窗外时不时一道闪电&#xff0c;雨也一阵一阵的&#xff0c;雷声像逐渐远离的喧嚣的火车一样。我不是睡眠困难者&#xff0c;但是&#xff0c;昨晚吃完晚饭之后&#xff0c;在衣服都未脱的情况下&#xff0c;晕晕乎乎的睡到现在…

Flink Kafka consumer的消费策略配置

val helloStream: FlinkKafkaConsumer011[String] new FlinkKafkaConsumer011[String]("hello", valueDeserializer, kafkaProps) // 指定消费策略 helloStream.setStartFromEarliest() // - 从最早的记录开始&#xff1b; helloStream.setStartFromLatest() //…

spdk/dpdk 编译相关问题汇总

下载 到官网上下载最新的spdk 代码。 解决编译依赖 yum install libaio.x86_64 libaio-devel.x86_64 编译dpdk 特别注意的是dpdk:依赖 /lib/modules/uname -a/build 下执行的内核已经存在&#xff0c;并且编译过&#xff0c;为此需要&#xff1a; 下载内核&#xff1b;安装依赖…

深入浅出 消息队列 ActiveMQ

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、 概述与介绍 ActiveMQ 是Apache出品&#xff0c;最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JM…

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28

赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做。就没看。 最后发现就是一个DP&#xff08;但是我觉得复杂度有点迷&#xff09; 题意&#xff1a;$n$只青蛙有参数$l,w,h$分别表示弹跳力&#xff0c;体重&#xff0c;身高&#…

消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ

一、 消息队列概述 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可…

程序员的恶性循环 !

穷人的恶性循环&#xff1a; 穷 -> 需要努力工作 -> 没有时间去交际 -> 人脉越来越狭窄 -> 工作越来越难做 -> 越需要努力去工作 -> 越没有时间去发展人脉 -> 越穷 富人的良性循环&#xff1a; 有钱 -> 工作很轻松 -> 很多时间都在交际上 -> 人…

刷脸考勤,重新定位校园管理

近几年&#xff0c;人脸识别技术在安防领域得到了广泛应用&#xff0c;随着技术的不断发展&#xff0c;它离我们的日常生活越来越近&#xff0c;手机、商场、公园、校园等都可以看到它的身影。刷脸考勤&#xff0c;重新定义校园管理。人脸识别&#xff0c;也叫面部识别&#xf…

python爬虫学习之页面登陆

爬虫学习的一点心得 登陆主要有3种方法&#xff1a;使用selenium&#xff0c;cookies&#xff0c;模拟表单登陆 个人对于一般情况使用cookies登陆 可以实现一次手动&#xff0c;长期自动&#xff0c;可以绕过登陆&#xff08;登陆的相关信息密码&#xff0c;账号等会存于cookie…

消息队列 应用场景 解析

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 另外腾讯云-云社区还有一文不允许转载&#xff0c;但内容挺好的&#xff1a;https://cloud.tencent.com/developer/article/1006035 分布…

求职面试的时候如何谈薪酬待遇

在社会大学里混了那么多年&#xff0c;我最惨痛的经历就是&#xff0c;在应聘一家企业的时候&#xff0c;总是羞于谈薪酬待遇。大概这是很多职场新人都会遇到过的尴尬吧——觉得自己经验不够&#xff0c;或者想应聘的企业比较好&#xff0c;就觉得对方提多少就是多少吧&#xf…

利用memcached实现CAS单点登录集群部署

前言&#xff1a;利用memcached实现CAS单点登录集群部署 负载均衡&#xff1a;将接口请求的有状态性变成无状态性。是我们在实现负载均衡时必要要解决的问题。以应用接口的session状态为例&#xff0c;一般解决方法都是将session数据和应用进行剥离&#xff0c;session数据统一…

注册

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>注册</title> {# 导入jQuery基础类库&#xff0c;才可以使用 $ #} <script src"../static/js/jquery-1.12.4.min.js"&…

Linux中10个有用的命令行补齐命令

本文由 极客范 - 踏雁寻花 翻译自 Balakrishnan Mariyappan。欢迎加入极客翻译小组&#xff0c;同我们一道翻译与分享。转载请参见文章末尾处的要求。在Linux系统中&#xff0c;输入一个命令&#xff0c;再按两次TAB键&#xff0c;就会列出所有以输入字符开头的可用命令。这并…

分布式开放消息系统 ( RocketMQ ) 的原理与实践

分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件&#xff0c;需要具有高吞吐量、高可用等特点。而谈到消息系统的设计&#xff0c;就回避不了两个问题&#xff1a; 消息的顺序问题消息的重复问题RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件&#xff…