Java自定义异常处理——最佳实践[译]

2023-05-16

我们几乎已经在我们的每个行业标准应用的代码中处理java自定义异常了。常见的手段是创建一个语义性的继承基础exception类的自定义异常类。

1)Java自定义异常处理 – 新的方法

1.1 传统异常处理

我们的新方法使用静态内部类来处理每个新的异常场景。

传统上我们通过继承Exception类来创建一个DBException。然后每次遇到需要抛出一个与数据库相关异常的时候,我们创建一个DBException的实例,添加一些信息之后抛出它。

现在让我们考虑以下我们需要抛出DBException的场景:

  1. SQL执行错误
  2. 找不到任何一行数据
  3. 当我们只需要一行数据却返回了多行数据
  4. 无效的参数错误
  5. 其它错误

上述方法的问题在于当这些异常在catch块或者应用代码中被处理时,DBException无法提供足够的信息来分别处理上面列出来的异常用例。

1.2 使用内部类的新异常处理

让我们为每一个用例创建一个内部类然后把它们组合到DBException内部来解决上述的问题吧。

首先创建一个抽象的BaseException来作为所有异常类的父类。

// BaseException.java
public abstract class BaseException extends Exception{
    private String message;
 
    public BaseException(String msg)
    {
        this.message = msg;
    }
    public String getMessage() {
        return message;
    }
}
复制代码

现在创建我们的Exception内部类。

// DBExeption.java
public class DBExeption
{

    public static class BadExecution extends BaseException
    {
        private static final long serialVersionUID = 3555714415375055302L;
        public BadExecution(String msg) {
            super(msg);
        }
    }
 
    public static class NoData extends BaseException
    {
        private static final long serialVersionUID = 8777415230393628334L;
        public NoData(String msg) {
            super(msg);
        }
    }
 
    public static class MoreData extends BaseException
    {
        private static final long serialVersionUID = -3987707665150073980L;
        public MoreData(String msg) {
            super(msg);
        }
    }
 
    public static class InvalidParam extends BaseException
    {
        private static final long serialVersionUID = 4235225697094262603L;
        public InvalidParam(String msg) {
            super(msg);
        }
    }
}
复制代码

这里我们创建了许多内部类来处理每一种异常情况。你可以根据实际情况随意扩展新的异常内部类。

1.3如何使用自定义异常

为了理解它的作用,现在让我们来让我们创建一个异常然后抛出它。然后我们将会在日志中看见错误信息。

// TestExceptions.java
public class TestExceptions {
    public static void main(String[] args)
    {
        try
        {
            throw new DBExeption.NoData("No row found for id : x");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
复制代码

程序输出:

Console
com.exception.DBExeption$NoData: No row found for id : x
at com.test.TestExceptions.main(TestExceptions.java:7)
复制代码

正如你在异常栈中所见的日志消息,它所携带的信息更多更具体了。它清楚展示了错误是什么。在应用代码之中,你也可以通过检查自定义异常实例来做对应的处理。

2. 使用内部类作为自定义异常类的优点

  1. 最显著的优点在于即使其它开发者写了一些难以读懂的错误信息,你也可以很清楚地弄懂具体错误是什么。
  2. 你可以使用不同的异常实例来处理不同的异常场景
  3. 你不需要使用单个异常来覆盖许多的异常情况
  4. 编写否定的单元测试用例会更加容易
  5. 日志会更加有意义以及高可读性

转载于:https://juejin.im/post/5cfe29e05188251346598d4d

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java自定义异常处理——最佳实践[译] 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • 使用 JDBC 获取 Oracle 11g 的最后插入 ID

    我是使用 Oracle 的新手 所以我将放弃之前已经回答过的内容这个问题 https stackoverflow com questions 3131064 get id of last inserted record in oracle
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向

随机推荐

  • java开源引擎easyrule_【Urule介绍】开源可视化规则引擎

    Urule介绍 由于工作需要 xff0c 我参考了许多优秀JAVA实现的开源规则引擎框架 xff0c 例如Drools等 xff0c 但是在茫茫人海中我发现了一个可视化配置基于RETE算法的规则引擎 xff0c 它的名字叫Urule xff
  • 用英语用计算机造句,英语造句用It’s adj (for sb) to do sth 造句10个

    来源 xff1a 学生作业帮 编辑 xff1a 作业帮 分类 xff1a 英语作业 时间 xff1a 2021 06 27 06 48 36 英语造句 用It s adj for sb to do sth 造句10个 希望以下诸多句子中 有
  • 【GTA5线上CyberBox小助手】 - 完全免费

    重要声明 CyberBox完全免费 xff0c 请勿转发盈利 xff0c 请勿上当受骗 简单描述 任务设置 外置辅助 刷钱刷级 xff0c 安全稳定 xff0c 完全免费 xff0c 打开即用 CyberBox的设计初衷是为了方便玩家过任务
  • 服务器c盘显示0字节可用,c盘0字节可用怎么解决 c盘0字节可用处理方法

    1 用户不需要的文件被删除后不会直接从磁盘上清除 xff0c 实际上是放到了回收站中 xff0c 回收站使用的就是系统C盘上的容量 xff0c 如果回收站里有很多大文件就会导致C盘容量被占用 xff0c 清空回收站会腾出C盘容量 2 用户在
  • 服务器维护经验分享,医院IT运维经验分享.pdf

    智慧医院之 IT运维管理经验分享 汇报人 xff1a 周月香 长沙市第一医院 信息科 PART01 医院信息化建设现状 目录 PART02 医院信息化运营管理 CO N TEN T PART03 信息工单及项目管理 医院概况 我院建于192
  • ajax表单图片,js中使用ajax上传一个带有图片的表单数据

    function save var formData 61 new FormData if 39 file 39 0 files length gt 0 formData append 39 pic 39 39 file 39 0 file
  • 服务器对操作系统有什么要求,服务器对操作系统有什么要求

    服务器对操作系统有什么要求 内容精选 换一换 查看用户的镜像类型 xff0c 如果是公共镜像则排除私有镜像的源镜像问题 镜像类型单击 申请服务器 xff0c 查看能否创建出此镜像的弹性云服务器 xff0c 申请完成后未出现此镜像对应的弹性云
  • 解决 martian source

    解决 martian source 第一步 xff1a etc sysctl conf 最后面添加 xff1a net ipv4 conf default log martians 61 0 net ipv4 conf all log ma
  • 如何划分地址段?

    今天一位网友问我该如何划分地址段以便进行网络流量限制 下面我就这个方法简单的说一说希望有所帮助 我们该如何划分地址段呢 xff1f ip地址段常用的有三类 xff1a xff21 类的默认子网掩码 255 0 0 0 xff0c 一个子网最
  • ONOS预热篇之ONOS简介

    为什么80 的码农都做不了架构师 xff1f gt gt gt ONOS问世后引起广泛关注 xff0c 关于 ONOS 与 ODL 的纷争不绝于耳 xff0c 最近小编拜读了一下 ONOS 白皮书 xff0c 并做了一点粗浅总结 xff0c
  • warning LNK4099: PDB 'vc100.pdb' was not found... 解决方案

    使用VS2010在编译得代码工程的时候 xff0c 原本在debug下是没有问题 xff0c 但是在release下编译始终会报 xff1a warning LNK4099 PDB 39 vc100 pdb 39 was not found
  • win7无法识别U盘,驱动信息:该设备的驱动程序未被安装。 (代码 28)

    台式机的win7 64位系统可以识别u盘 xff0c 但笔记本的win7 64位却识别不了 xff0c 说明U盘是可以用的 查看笔记本的设备管理器 xff0c 发现驱动安装失败 xff0c 提示信息为 该设备的驱动程序未被安装 代码 28
  • 微信小程序——navigator无法跳转

    今天在做小程序的时候 xff0c 发现用navigator无法进行跳转 url 路径也是对的 后面发现是因为我需要跳转的页面定义在了tabBar里面的 如下图 xff1a 如果需要跳转到tabBar里面定义的这些页面 xff0c 需要用到w
  • java中调用父类方法之super关键字的疑惑?

    在java中有super和this这2个关键字 xff0c 我有时候对super有一些疑惑 xff0c 我甚至认为我对super和this这2个关键字还没理解 xff01 大家请看下面的代码 xff0c 帮我解惑一些呗 xff01 谢谢 p
  • Docker修改daemon.json后无法启动的问题

    本文的运行环境为Centos 7 3 xff0c Docker与Kubernetes的安装方式见kubeadm安装kubernetes V1 11 1 集群 最近在整理Docker和Kubernetes中的日志与相关配置 xff0c 在尝试
  • android点击全屏预览照片第三方库使用

    android点击全屏预览照片第三方库使用 imgepreviewlibrary 移动端我们经常会遇到放大预览照片 xff0c 如果是一张照片 xff0c 那就全屏展示图片就好了 xff0c 但是如果是一个列表 xff0c 滑动查看 xff
  • R语言绘图-legend()添加图例

    legend x y 61 NULL legend fill 61 NULL col 61 par 34 col 34 border 61 34 black 34 lty lwd pch angle 61 45 density 61 NUL
  • MySQL数据库 资源

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 面试题 xff1a Linux运维必会的MySQL企业面试题大全 推荐 xff1a http blog 51cto com xiaogongju 2068526 mysql
  • LM358 电路 10倍放大

    如何用LM358将0 3V电压放大10倍 放大倍数 61 1 43 R2 R1 xff0c 放大10倍 xff0c 选择R1 61 2K xff0c R2 61 18K 转载于 https blog 51cto com 990487026
  • Java自定义异常处理——最佳实践[译]

    我们几乎已经在我们的每个行业标准应用的代码中处理java自定义异常了 常见的手段是创建一个语义性的继承基础exception类的自定义异常类 1 Java自定义异常处理 新的方法 1 1 传统异常处理 我们的新方法使用静态内部类来处理每个新