赞
踩
目录
- try {
- PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
- List<MdaDataAcquisitionDTO> list = mdaDataAcquisitionService.getPage(dto);
- PageInfo<MdaDataAcquisitionDTO> pageInfo = new PageInfo<MdaDataAcquisitionDTO>(list);
- return ApiResult.ok(pageInfo);
- }catch (BadSqlGrammarException e) {
- logger.error(e.getMessage());
- logger.error(e.toString());
- logger.error("1111111111111111111111");
- e.printStackTrace();
- return ApiResult.error(ErrorMessage.INTERNAL_SERVER_ERROR);
- }catch (Exception e) {//Exception范围要大于上一catch
- logger.error(e.getMessage());
- logger.error(e.toString());
- logger.error("1111111111111111111111");
- e.printStackTrace();//输出错误堆栈信息
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- return ApiResult.error(ErrorMessage.INTERNAL_SERVER_ERROR);
- }finally {
-
- }
exception对象的常用方法:
方 法 | 说 明 |
getMessage() | 返回exception对象的异常信息字符串 |
getLocalizedmessage() | 返回本地化的异常错误 |
toString() | 返回关于异常错误的简单信息描述 |
fillInStackTrace() | 重写异常错误的栈执行轨迹 |
e.printStackTrace() 会导致锁死?一般不推荐
短时间内大量请求访问此接口 -> 代码本身有问题,很多情况下抛异常 -> e.printStackTrace() 来打印异常到控制台 -> 产生错误堆栈字符串到字符串池内存空间 -> 此内存空间一下子被占满了 -> 开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了 -> 大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)-> 相互等待,等内存,锁死了,整个应用挂掉了。
综上,这就是 e.printStackTrace() 引发的血案。
总结当然重要,有3点:
1,代码质量啊亲,代码可以不抛异常咱。
2,不要使用 e.printStackTrace() 啊,这玩意儿,在项目发布后,除过不断的刷控制台,并没用什么卵用啊,可以用 log 对象输出到日志文件里面啊。
3,推及开来,在java中,会产生大量字符串的方法,使用时,一定得悠着点,别一不小心撑到肚子(字符串池所属的那么点非堆内存空间),撑到肚子了,会死的啊 。
*代码执行的顺序:
*1.try内的代码从出现异常的那一行开始,中断执行
*2.执行对应的catch块内的代码
*3.继续执行try catch 结构之后的代码
*注意点:
*1.如果catch内的异常类存在子父类的关系,那么子类应该在前,父类在后
*2.如果finally中有return语句,那么最后返回的结果肯定以finally中的返回值为准
*3.如果finally语句中有return,那么没有被处理的异常将会被吞掉
*重写的注意点:
*1.儿子不能比父亲的本事大
*2.儿子要比父亲开放
*3.儿子不能比父亲惹更大的麻烦(子类的异常的类型不能是父类的异常的父类型)
*异常类Api:
*1.getMessage():获取异常描述信息字符串
*2.toString():返回异常类的包路径和类名和异常描述信息字符串
*3.printStackTrace():除了打印toString的信息外,还要打印堆栈信息
————————————————
版权声明:本文为CSDN博主「静夜思乡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wanghuiwei888/article/details/78818203
spring-事务注解:
import org.springframework.transaction.annotation.Transactional;
@Transactional
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
https://blog.csdn.net/qq_27828675/article/details/80499839
https://www.cnblogs.com/caoyc/p/5632963.html
事物是程序运行如果没有错误,会自动提交事物,如果程序运行发生异常,则会自动回滚。
如果使用了try捕获异常时.一定要在catch里面手动回滚。
事物手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
import org.springframework.transaction.interceptor.TransactionAspectSupport;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。