java异常处理方式推荐做法_谈谈Java异常处理这件事儿

此文已由作者谢蕾授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

前言

我们对于“异常处理”这个词并不陌生,众多框架和库在异常处理方面都提供了便利,但是对于何种处理才是最佳实践,也是众说纷纭。异常处理是否得当直接关系到软件的健壮性,今天就谈谈我对异常处理这件事儿的拙见。首先,先说一下异常处理的通俗解释:当危险或知道事情不对的时候做出的反馈。

目录结构Java的异常分类

常见的异常处理的方法

推荐的实践方式

1. Java的异常分类

先简单用图介绍一下Java的异常分类:

a67aba46c3365f086180adb61abaabc1.png

JAVA这种面向对象的语言,同样把异常当作对象来处理,Throwable作为所有异常的超类,然后定义了许多异常类,将这些异常类分为两大类:错误Error和异常Exception。其中,Exception异常类又分为RuntimeException和Checked Exception(也叫非运行时异常)。 Error是程序无法处理的错误,比如OutofMemoryError、TheadDeath等。Exception是程序本身可以处理的异常,应当尽可能去处理这些异常。运行时异常都是RuntimeException类及其子类异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理,如NullPointerException。通常,这些异常一般是由错误代码逻辑引起的,我们应该从逻辑角度尽可能避免这类异常的发生。 非运行时异常从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException 、SQLException等以及用户自定义的异常,一般情况下不自定义运行时异常。

2. 常见的异常处理方法

根据Java工程分层的思想,异常处理也是基于分层的思想。每层都和他的上下层之间都有一个契约,契约内容中就包含了异常处理。任何一层都可能遇到不测,如果遇到了未知的错误,不知道如何处理时,通常的做法就是愉快的向上层抛出一个异常,渴求有一层能正确处理掉这个可怜的错误。我们常用的Java异常处理机制通常依赖于try、catch、finally、throw、throws。 常见的异常处理方式如下:吞掉并抛出

打印log并抛出

嵌套处理并抛出

忽略异常

2.1 吞掉并抛出try{

...

}catch(Exception e){throw new ApiException(ApiErrorCode.SqlErr, "Failed to get JobID.");

}

注:ApiException是程序自定义的异常,与SQLEXCEPTION、RUNTIMEEXCEPTION等都属于异常的一种。 比较明显,这种处理方式导致丢失了真实的错误信息,不利于上层做出正确的处理。非常不好的实践。

2.2 打印log并抛出try{

boolean ret = sendNotify(info);

if(ret){

i.remove();

}

}catch(ParseException | IOException e){

logger.error("unexpected exception happened while send notify to client! remove notify message! jobID: " + info.getJobID(), e);

throw e;

}

这个做法想必大家经常看到,在许多工程中都用了这样的做法。但是这样的处理方式也在一定环境下也有问题,比如,当异常发生在调用层次较深的底层时,同样的错误信息处理方式,会导致我们为了定位问题将看到无数的相同错误信息。所以,具体的异常处理方法还需要综合上下文来处理。

2.3 嵌套处理并抛出try{

...

}catch(SQLException e){throw new XxxException("Error in Xxx", e);

}

这段代码catch住了sql异常,然后将其封装为另外一种异常抛出,期望遇到知心人能读懂它的良苦用心。

2.4 忽略异常try{

...

}catch(SQLException ex){

ex.printStacktrace();

}

经常看到这样的低级错误吗?是的,开发者无情的忽略了异常,并且只把异常信息输出到控制台,然后,程序仍然继续运行,非常有可能导致更多的异常。

3.推荐的实践方式

此节不敢称为最佳实践,因为一切都会随着空间和时间的变化而变化。只能说下笔者见过的对异常处理的一些推荐做法。如有不适当的地方,请大家指正。如果不知道如何处理异常,最好在定义方法时throws该异常,可以声明多个异常。

细化异常,尽可能的指定具体的异常,方便问题定位,尽量不要使用范围太大的Exception。但是,有时一定要最大范围捕获的,比如一些线程不想让它意外退出,那就必须通过最外层捕获它了。

避免过大的try块(对所有可能出现异常的代码进行try块的包装),这样不利于分析问题产生的原因。

一个try对应多个catch时,catch的异常定义可以由精确到一般。

不要无视捕获的异常,小心因小失大。捕获到后要么直接抛出,要么重新抛出新类型的异常。

不要在finally块中return或throw等终止方法的语句,这样会导致try或catch块中的return或throw失效。

鼓励程序适时的进行自定义异常类(非检测异常的一种),因为异常的类名往往包含了很多有用信息,我们封装后的异常类可以更加具体的根据代码或业务处理区分异常类型,方便查找错误。

调试时可以使用printStackTrace()方法,但是发布后要避免使用该方法。

管理好自己和其他层之间的异常处理,契约精神,注意:不要把自己能处理的异常抛给别人。

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击。

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

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

相关文章

java 抽象类 final_final/抽象类/interface

lesson Thirteen                          2018-05-10 02:10:43final:最终的,可以修饰类、属性、方法1.final修饰类:这个类就不能被继承,如:String类,StringBuffer类,System类1…

java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO

来源:木杉的博客 ,imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/Java传统IO是不支持中断的,所以如果代码在read/write等操作阻塞的话,是无法被中断的。这就无法和Thead的interrupt模型配合使…

java值栈_Struts2学习笔记-Value Stack(值栈)和OGNL表达式

只是本人的Struts2学习笔记,关于Value Stack(值栈)和OGNL表达式,把我知道的都说出来,希望对大家有用。一,值栈的作用记录处理当前请求的action的数据。二,小例子有两个action:Action1和Action2Action1有两个…

php 接口日志,PHP 开发 APP 接口--错误日志接口

APP 上线以后可能遇到的问题:① APP 强退② 数据加载失败③ APP 潜在问题错误日志需要记录的内容数据表 error_log 字段:idapp_id:app 类别 iddid:客户端设备号version_id:版本号version_mini:小版本号erro…

php cannot call constructor,安装ECshop普遍问题的解决方法

安装时的问题:1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解决:找到install/includes/lib_installer.php中的…

zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?

我最近玩了zblog一段时间,对于大多数第一次联系zblog的博客,他们会问zblog是否适合PHP或ASP?我们该如何选择?事实上,我真的不明白这个问题。我个人更喜欢PHP。今天我将整理出来并对PHP版本和ASP版本进行比较&#xff0…

php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...

据了解,很多中大型企事业单位的IT基础结构具有复杂、分散等特征,并且信息化程度越高,数据类型越繁杂,数据量也越庞大。许多单位不得不付出极大的人力、物力对网络进行管理。而一个单位的信息化的程度和IT部门的服务水平&#xff0…

设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置

CentOS下PPPoE拨号设置1.查看并安装拨号软件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

linux上pyenv卸载,在Ubuntu 18.04系统下安装pyenv的方法

本文介绍在Ubuntu 18.04操作系统下安装pyenv的方法,使用它可以进行Python多版本管理,目的是防止不同的Python版本因为不兼容而出现错误。安装pyenv其实非常的简单,只需要在系统终端中运行一条命令即可,以下是操作方法,…

linux防火墙作用是什么,Linux防火墙操作1

什么是防火墙防火墙可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。简单来讲 就是防止外界通过网络攻击Linux服务器的一个软件本次学习目标:防火墙的启停&#xff0…

lede 自定义linux,OpenWrt 和 LEDE 宣布正式合并

OpenWrt 和 LEDE 项目已在官网正式宣布合并,合并后的项目仍用 OpenWRT 命名。合并后的 OpenWrt 项目将按照 LEDE 制定的规范进行管理。原有的 LEDE 和 OpenWrt 项目的活跃成员将继续在合并后的 OpenWrt 上工作。LEDE 项目是 OpenWrt 的一个衍生项目,曾被…

旧衣回收小程序搭建有什么优势?

今年以来,旧衣回收行业分外火热,不断有创业者进入到市场中,其中不乏有年轻人,足以可见行业的火爆。 我国是人口大国,每个人闲置的衣物加在一起的数量难以计算,旧衣回收行业具有巨大的发展空间。 此外&…

c语言程序兔子反之问题,C语言解决兔子产子问题代码及解析

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?问题分析兔子数的规律,如下表所示:月数小兔子对数中…

c语言fork()创建线程,操作系统的创建原语是fork()还是creat()?

满意答案MythSwift2013.09.10采纳率:55% 等级:12已帮助:9461人一个进程就相当于一个主线程。fork一个进程与create一个线程的区别:fork进程:子进程复制父进程的进程环境。父进程结束不会影响子进程的运行。进程切换复制进程环境。create线…

android 最新 support,android support v7 下载-android support.v7包 官方最新版 - 河东下载站...

android support v7是一款功能非常实用的android在进行开发的过程中,必须要进行使用的一个包;这款软件作为一个功能非常全面的功能包,也是目前为止最新的功能包,是您这使用Android开发的时候,非常重要的一环&#xff1…

android aar jar制作,AndroidStudio aar、jar生成及其引用

aar生成新建项目,并在项目中新建Library module:banner,如图:在新建Module中编写完代码后,build整个工程后就会自动生成aar包,包的路径在新建Module 》 build 》outputs >aar目录下;aar引用在…

android 点击侧滑代码,代码分析Android实现侧滑菜单

Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单。最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout。1、实现效果2、动画类UgcAnimationspackage com.mmsx.base;import android.content.Context;import and…

html游戏怎么编辑器,HTML的编辑器使用

使用 Notepad 或 TextEdit 来编写 HTML可以使用专业的 HTML 编辑器来编辑 HTML:Adobe DreamweaverMicrosoft Expression WebCoffeeCup HTML Editor(推荐学习:HTML入门教程)不过,我们同时推荐使用文本编辑器来学习 HTML,比如 Notep…

鸿蒙系统hifi,Apple Music将迎来重大更新 HiFi无损音质即将上线?

原标题:Apple Music将迎来重大更新 HiFi无损音质即将上线?前不久有媒体报道称,苹果将在当地时间5月18日推出HiFi版AppleMusic服务,新服务将为Apple Music用户提供无损的流媒体音乐,满足HiFi用户对高音质的追求。而在近…

华为笔记本会不会用鸿蒙,华为MateBook Pro笔记本为什么不用鸿蒙操作系统HarmonyO?...

头条上整天就是各种华为啊鸿蒙啊的,搞得好像人人都见过鸿蒙一样。还是大家以为操作系统就是做个APP或者王者荣耀?据我所知,鸿蒙OS现在我们能看到的,也就是几张PPT截图吧?整天动不动,这个为啥不用鸿蒙&#…