Atitit 异常的实现原理 与用户业务异常
Atitit 异常的实现原理 与用户业务异常
1.1. 异常的实现原理
方法调用栈(method invocation stack)来跟踪每个线程中一系列的方法调用过程。该堆栈保存了每个调用方法的本地信息(比如方法的局部变量)。每个线程都有一个独立的方法调用栈。对于Java应用程序的主线程,堆栈底部是程序的入口方法main()。当一个新方法被调用时,Java虚拟机把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法。
当一个方法正常执行完毕,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块。它首先查看当前方法是否存在这样的catch代码块,如果存在,那么就执行该catch代码块;否则,Java虚拟机会从调用栈中弹出该方法的栈结构,继续到前一个方法中查找合适的catch代码块。在回溯过程中,如果Java虚拟机在某个方法中找到了处理该异常的代码块,则该方法的栈结构将成为栈顶元素,程序流程将转到该方法的异常处理代码部分继续执行。当Java虚拟机追溯到调用栈的底部的方法时,如果仍然没有找到处理该异常的代码块,按以下步骤处理。
(1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。
(2)如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程(即方法调用栈的底部为main()方法),那么整个应用程序被终止。
1.2. 用户业务异常
用户系统
Pwd_or_uname_err
User_already_exist
账户系统
Amount_not_ennagh
1.3. 异常转译和异常链
在分层的软件结构中,会存在自上而下的依赖关系,也就是说上层的子系统会访问下层系统的API。当位于上层的子系统不需要关系来自底层的异常的细节时,常见的做法是捕获原始的异常,把它转换为一个新的不同类型的异常,再抛出新的异常,把它转换为一个新的不同类型的异常,再抛出新的异常,这种处理异常的方法称为异常转译。
从面向对象的角度来理解,异常转译使得异常类型与抛出异常的对象的类型位于相同的抽象层。例如:车子运行时会出现故障异常,而职工开车上班会出现迟到异常,车子的故障异常是导致职工的迟到异常的原因,如果员工直接抛出车子的故障异常,意味着车子故障是发生在职工身上的,这显然是不合理的,正确的做法是,将在职工类里发生的车子异常转译为迟到异常。
1.4. 避免异常
应该尽可能地避免异常,尤其是运行时运行时异常。避免异常通常有两种办法:
(1)许多运行时异常是由于程序代码中的错误引起的,只要修改了程序代码的错误,或者改进了程序的实现方法,就能避免这种错误。
(2)提供状态测试方法。有些异常是由于当对象处于某种状态时,不合适某种操作而造成的。例如当高压锅内的水蒸气的压力很大,突然打开锅盖,会导致爆炸。为了避免这类事故,高压锅应该提供状态测试功能,让使用者在打开锅盖前,能够判断锅内的高压蒸汽是否排放完。在程序上,调用某个方法,可以先用状态测试功能来测试一下,满足条件才调用它,避免出现异常。
1.5. 异常恢复
保持异常的原子性有以下办法。
(1)最常见的办法是先检查方法的参数是否有效确保当异常发生时还没有改变对象的初始状态(也就是异常发生之前,检查好各个条件,确保异常不会发生才开始改变对象的状态)。
(2)编写一段恢复代码,由它来解释操作过程中发生的失败,并且使对象状态回滚到初始状态。这种办法不是很常用,主要用于永久性的数据结构,比如数据库的事务回滚机制就采取了这种办法。
(3)在对象的临时拷贝上进行操作,当操作成功后,把临时拷贝中的内容复制到原来的对象的对象中。
1.6. catch代码块中捕获异常处理流程
只要异常发生,就意味着某些地方出了问题,catch代码块既然捕获了这种异常,就应该提供处理异常的措施,比如:
(1)处理异常。针对该异常采取一些行动,比如弥补异常造成的损失或者给出警告信息等。
(2)重新抛出异常。catch代码块在分析了异常之后,认为自己不能处理它,重新抛出异常。
(3)进行异常转译。把原始异常包装为适合于当前抽象层的另一种异常,再将其抛出。
(4)假如在catch代码块中不能采取任何措施,那就不要捕获异常,而是用throws子句声明异常抛出。
java 详解异常处理原理 - Code-lover's Learning Notes - 博客频道 - CSDN.NET.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit 异常的实现原理 与用户业务异常的更多相关文章
- DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战
大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...
- Atitit.异常的设计原理与 策略处理 java 最佳实践 p93
Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是:: 2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供 ...
- 从时序异常检测(Time series anomaly detection algorithm)算法原理讨论到时序异常检测应用的思考
1. 主要观点总结 0x1:什么场景下应用时序算法有效 历史数据可以被用来预测未来数据,对于一些周期性或者趋势性较强的时间序列领域问题,时序分解和时序预测算法可以发挥较好的作用,例如: 四季与天气的关 ...
- Atitit.可视化与报表原理与概论
Atitit.可视化与报表原理与概论 1. 信息可视化1 2. Gui可视化1 3. 报表系统(三大图表,金字塔,组织结构图等)1 4. <可视化数据>目录3 5. 可视化的具体实现(c ...
- Atitit. Xss 漏洞的原理and应用xss木马
Atitit. Xss 漏洞的原理and应用xss木马 1. XSS漏洞1 2. XSS的用途2 2.1. 盗取cookie2 2.2. 刷新流量 刷分3 2.3. DOS 窃取隐私”.“假冒身份”. ...
- Atitit.图片木马的原理与防范 attilax 总结
Atitit.图片木马的原理与防范 attilax 总结 1.1. 像图片的木马桌面程序1 1.2. Web 服务端图片木马1 1.3. 利用了Windows的漏洞1 1.4. 这些漏洞不止Windo ...
- UEBA 学术界研究现状——用户行为异常检测思路:序列挖掘prefixspan,HMM,LSTM/CNN,SVM异常检测,聚类CURE算法
论文 技术分析<关于网络分层信息泄漏点快速检测仿真> "1.基于动态阈值的泄露点快速检测方法,采样Mallat算法对网络分层信息的离散采样数据进行离散小波变换;利用滑动窗口对该尺 ...
- atitit. web组件化原理与设计
atitit. web组件化原理与设计 1. Web Components提供了一种组件化的推荐方式,具体来说,就是:1 2. 组件化的本质目的并不一定是要为了可复用,而是提升可维护性. 不具有复用 ...
- Atitit.linq java的原理与实现 解释器模式
Atitit.linq java的原理与实现 解释器模式 1. Linq from where 的实现1 2. Where expr 的实现1 3. Attilax的一点变化2 4. 解释器模式的 ...
随机推荐
- iframe自适应高度,根据src中页面来得到。
在页面布局时,div+iframe能根据具体的大小进行布局.但,对于iframe的适应大小,仍需js获取内部html文件来改变. function reinitIframe(){ var iframe ...
- jsp页面格式时间yy-mm-dd
这个问题把我花了1小时都没弄出来 各种报错 还是最后同学告知才知道的. 导入 :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...
- 【九度OJ】题目1202:排序
题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100). 接下来的一行包括n个整数. 输出: 可能有多组测试数据,对于每组数据,将排序后 ...
- (转)RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
PS:如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for En ...
- linux下配置ssledge代理服务器
ssl edge 是一个非常好用的VPN/proxy, 比云梯 稳定快速的多. 在LINUX下开发 Titanium 需要用到各种FQ,所以它是必备工具. 1. 根据自己付费后的用户名和密码,下载 ...
- 使用小技巧,让你高效使用Eclipse
1.自动完成--Eclipse有一个自动完成代码功能,快捷键是ctrl + space.当点击时就会弹出一个对话框,上面有与前后文相关的一些建议.只要有一个可能性,Eclipse就会替你完成. 2.快 ...
- JAVAWEB学习
http://www.cnblogs.com/xdp-gacl/p/3744053.html JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
- libev安装与示例程序编译运行
Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...
- [置顶]PADS PCB功能使用技巧系列之NO.003- 如何统一修改元件标号字体?
LAYOUT完毕后进行元件标号字体调整时,你是否试图用Select Document+Select All来选定所有标号?可结果却并不令人满意. (1)在Layout中,选择菜单栏Edit -> ...
- 为什么学习webdriver
http://www.boobooke.com/goods-37.html