文档章节

Java异常处理的最佳实践

北有风雪
 北有风雪
发布于 2017/02/16 13:54
字数 1128
阅读 6
收藏 0
点赞 0
评论 0

Java异常处理的最佳实践

为什么要有最佳实践

我们在写程序是不可避免的要对代码进行异常处理,但是有时对异常的处理会使我们的程序变的更加糟糕,这是我们所不想看到的。所以,我们再进行异常处理时需要遵循一定的套路,来降低异常处理对我们程序的影响。

异常产生的原因

一般来说,java中的异常会产生于一下三种情况:

  1. 编程错误导致的异常,例如NullPointerException 和 IllegalArgumentException。这类的异常一旦发现,必须通过修改代码来解决。
  2. 资源错误导致的异常,例如网络资源socket、文件资源等。这类的异常出现时往往会以记录日志,挂起程序或者进行重试来作为解决方法。
  3. 输入数据导致的异常,例如输入的JSON数据与程序中所指定的规范不一致,由此产生数据无法正常解析所抛的异常。这类的异常发生时,需要逐步调试程序或输入的数据。

Java异常的分类

java中定义了两种异常:

  • Checked Exception:该类异常直接继承自Exception类。在调用抛出checked exception的API时,必须使用catch进行异常处理或者将该异常throw出去,否则代码不能通过编译。
  • Unchecked Exception:该类异常继承自Runtime Exception,Runtime Exception也继承自Exception类,该类异常不需要显式的进行处理就可以进行编译。

进行异常处理的最佳实践

异常选择

对于程序可以进行处理的异常,一般选择通过Checked Exception进行抛出,程序在catch住一个异常之后,可以选择记录日志或者恢复数据或者进行别的操作。
对于程序无法处理的异常,一般抛出Unchecked Exception,将异常抛往更高层的逻辑进行处理,当然Unchecked Exception也是可以进行catch的,当所有的代码均没有对该异常进行处理时,该异常会被交给应用容器进行处理。

在异常处理中释放资源

在各种IO中,一般都会有异常处理,再进行Checked Exception处理时一般在finally中关闭资源。

SQLException一般会被转换成Unchecked Exception

数据库异常一般来说都是连接断掉或者是没有权限等问题,这些在代码里面没法进行处理,因此应该抛出Unchecked Exception。对于某些数据库异常,我们虽然无法解决根本问题,但是仍然是需要进行处理的,比如插入数据是失败,我们应该在代码中捕获该异常,并将原始数据记录下来。

不要使用异常作流程控制

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

使用异常进行业务数据校验

对于需要用户输入有要对其进行业务性校验的需求,可以在业务校验失败时抛出自定义异常来告知失败的原因。
例如:在登陆功能中,如果身份校验失败,可以抛出相应的异常到控制器,然后有控制器进行数据输出。

不要忽略异常

针对大多数异常来说,不要使用空的catch块来处理异常。

尽量不要捕捉高级别的异常

高级别的异常会将低级的异常信息吃掉,因此再进行处理时应该尽量捕捉具体的异常类型。
比如,使用Exception作为catch的对象就是一个极端的例子,任何情况下都不要catch Exception这个类,因为这样做毫无意义。

只处理一次

我看到过有人在写代码时catch到了一个异常,然后logger.error(e)进行处理,然后又把这个异常throw出去了,这会导致该异常被处理多次,给拍错人为的增加难度,既然决定将异常抛出就不要进行日志的输出了,但是如果想保存当前变量的状态仍然是可以的,不过这样做,throw这个异常就显得意义不大了。

© 著作权归作者所有

共有 人打赏支持
北有风雪
粉丝 2
博文 33
码字总数 55091
作品 1
程序员
学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

Java 已老,Kotlin 或将取而代之!

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! Java已经成为历史。它无法发展成现代语言,同时保证向后兼容性。但它为我们带来了最好的JVM生态系统,并引导了许多优秀语言...

CSDN ⋅ 05/12 ⋅ 0

Java Web应用的代码分层最佳实践。

代码分层,对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。 从另外一...

⋅ 05/06 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

从Java小白到架构师必须要看的书籍,真正的“武林秘籍”!

少年,我看你骨骼精奇,将是未来万中无一的IT精英,很是适合学JAVA。维护世界和平就看你的了,我这里有能让你成为IT精英的办法!还不来看看! 基础类 1、《Thinking in Java》,入门第一位是...

启示录是真的 ⋅ 05/25 ⋅ 0

【小马哥】Spring Boot系列讲座

这里为大家推荐一个不错的Spring Boot系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、...

杜琪 ⋅ 03/02 ⋅ 0

【小马哥】Spring Cloud系列讲座

这里为大家推荐一个不错的Spring Cloud系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施...

杜琪 ⋅ 03/02 ⋅ 0

加强Docker容器与Java 10集成

很多运行在Java虚拟机(JVM)中的应用,包括数据服务如Apache Spark和Kafka以及传统企业应用,都运行在容器中。最近,运行在容器里的JVM出现了由于内存和CPU资源限制和使用率导致性能损失问题...

java高级架构牛人 ⋅ 06/04 ⋅ 0

JVM学习之——Java内存区域

为了加深对Java语言的理解,加深对Java虚拟机工作机制、底层特性的了解和掌握,准备在闲暇时间,抽空对《深入理解Java虚拟机 JVM高级特性与最佳实践》一书进行学习。本文是学习此书第2章时的...

你想要怎样的未来 ⋅ 05/27 ⋅ 0

PMD 6.4.0 发布,支持 Java 10 局部变量类型推断

PMD 6.4.0 发布了,这是一个小的更新版本,带来了一些新特性和 bug 修复。 值得关注的大变动是: 支持 Java 10,Java 10 中引入的局部变量类型推断已经能够被 PMD 理解。 支持类型解析,现在...

雨田桑 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部