JAVA业务系统异常抛出的总结
JAVA 做web开发的过程中,什么时候该抛出异常,什么时候不该抛出异常,我想大家都有自己的想法和意见,下面是我的总结,欢迎大家批评指正。
第一种场景:
如果你的系统需要展现一个列表,并且列表中包含了统计数据列。
如下图所示:
网站ID | 网站名称 | URL | 月展现PV |
123 | 服装 | ...... | 500万 |
其中:
网站ID,网站名称,URL 这3列数据数据网站基本信息,他们是来自一张网站信息表的。
月展现PV 是网站的扩展信息,他来自一张网站PV日志报表的。
这两张表不在一个数据库里面,所以无法进行关联查询。
所以为了展现整个列表的目的,一种方法是我们需要执行两次查询,然后把两次查询的结果合并在一个结果集里面进行返回,最后前端的页面再进行展现。
那么如果我们采用两次查询,再组装成一个结果集来返回的话,那么问题就出现了:
1、如果在第一次查询网站的基本信息表时,服务失败了,那么我们是应该抛出异常提示用户系统出现异常同时展现一个空的列表给用户呢,还是说不给出提示用户‘系统异常’ 的信息,而是直接给用户一个空的列表。
2、如果第二次查询网站的扩展报表数据时,服务失败了,那么我们是应该抛出异常,显示空的列表,并且给出提示呢,还是说列表中的其他列正常的显示出来,只是空出 ‘月展现PV’ 列,应为查询月展现PV的服务出现了异常,但是异常没有被抛出,只是空了此列。
方案:
1、如果你的系统是像银行这些实时要求比较高的系统,那么无论出现上面问题的任何一个问题,都应该抛出异常,并且在页面是提示用户你的系统出现了故障,并且显示一个空的列表给客户。
2、如果你的系统用户的要求不是很严格,那么第一次查询基本信息失败时最好也是抛出异常,给出提示。
3、在系统用户要求不严格的情况下,但是如果是第二次查询出了问题,那么你可以选择只展现第一次查询的基本信息列,而空去出错的列,然后给出用户一些提示,或者不给。而不是抛出异常导致整个列表都不能正常的现实出来。
总之在查询操作时,你可以选择性的抛出异常。
JAVA异常的抛出和捕获处理需要系统付出很大的代价,所以根据的你的情况选择性的抛出异常,不要抛出不必要的异常。第二次的查询失败就是可以不抛出异常的情况。
第二中场景:
在做更新操作时,因为涉及到事务以及数据的回滚,而我们目前流行的JAVA构建回滚事务的前提就是以异常为判断的,所以为了保证事务的有效性,我们最好的我们的代码中你遇到失败问题是就抛出异常,一次保证事务性。
相关推荐
抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 直接抛出异常 封装异常再抛出 捕获异常 自定义异常 try-catch-finally try-with-resource Java异常常见面试题 1. Error 和 Exception 区别是什么? 2. 运行时...
- Java允许开发者扩展`java.lang.Exception`或其子类来自定义异常,以便根据业务需求抛出特定类型的异常,并在catch块中针对这些自定义异常进行个性化的捕获和处理。例如,在`CustomExceptionDemo`示例中创建了一个...
java实现银行的通常业务,存钱,取钱,计算利息,异常抛出与处理等··········
使用springboot框架快速搭建,封装自定义断言做业务校验,公共异常处理打印日志, 更简单的业务判断处理
当权限检查失败时候,会抛出一个自己定义的AuctionException异常。 此外,还利用到了Spring的任务调度和邮件支持。当竞价成功之后会发送邮件到用于用以确认。本系统将DWR和Spring无缝整合在一起,既充分利用了Spring...
在 Spring Boot 中,可以通过 @ControllerAdvice 注解创建一个全局异常处理器,该处理器可以捕获所有控制器抛出的异常。在全局异常处理器中,可以使用 @ExceptionHandler 注解指定要处理的异常类型,并编写相应的...
异常抛出之后,程序后面的代码就执行不到了,无法进行后面的代码执行。实际的业务开发中,有的时候我们更期望的结果是:不管你服务端是超时了还是服务不存在,我们都应该获得最终的请求结果(HTTP请求结果状态400、...
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB...
业务异常应该由程序员在写业务的时候在可能发生业务异常的时候抛出,系统异常就是系统运行时除了业务异常其余都是系统异常,业务异常处理有3种操作,保存在 数据库,保存在文件,或者都保存,系统异常也一样
•程序很少会自行抛出系统异常,因为异常的类名通常包含了该异常的有用信息。所以在选择抛出什么 异常时,应该选择合适的异常类,从而可以明确地描述该异常情况。在这种情形下,应用程序常常需要 抛出自定义异常。...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...
不要过度使用try-catch,应尽量抛出业务异常给上层处理。 使用finally块进行资源清理。 并发编程: 使用synchronized关键字或Lock接口进行同步控制。 利用ExecutorService进行多线程任务管理。 注意volatile关键字...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...
从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...
9.3.4 覆盖与异常抛出 9.3.5 抽象方法覆盖 9.3.6 覆盖与重载 9.4 静态绑定与动态绑定 9.4.1 静态绑定 9.4.2 动态绑定 9.5 抽象类 9.5.1 抽象类概念 9.5.2 抽象类应用 9.5.3 抽象类注意事项 9.6 本章习题 ...
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性
保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始...