`
dickyzhu
  • 浏览: 111798 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

异常转译与异常链

 
阅读更多

    1、异常转译的原理
    所谓的异常转译就是将一种异常转换另一种新的异常,也许这种新的异常更能准确表达程序发生异常。
    在Java中有个概念就是异常原因,异常原因导致当前抛出异常的那个异常对象,几乎所有带异常原因的异常构造方法都使用Throwable类型做参数,这 也就为异常的转译提供了直接的支持,因为任何形式的异常和错误都是Throwable的子类。比如将SQLException转换为另外一个新的异常 DAOException,可以这么写:
    先自定义一个异常DAOException:
     
 public class DAOException extends RuntimeException {
     //(省略了部分代码)
        public DAOException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    比如有一个SQLException类型的异常对象e,要转换为DAOException,可以这么写: 
    DAOException daoEx = new DAOException ( "SQL异常", e);
    异常转译是针对所有继承Throwable超类的类而言的,从编程的语法角度讲,其子类之间都可以相互转换。但是,从合理性和系统设计角度考虑,可将异常 分为三类:Error、Exception、RuntimeException,笔者认为,合理的转译关系图应该如图 2:
   
 
图 2 异常转译
    为什么要这么做呢?笔者认为,异常的处理存在着一套哲学思想:对于一个应用系统来说,系统所发生的任何异常或者错误对操作用户来说都是系统"运行时"异常,都是这个应用系统内部的异常。这也是异常转译和应用系统异常框架设计的指导原则。在 系统中大量处理非检查异常的负面影响很多,最重要的一个方面就是代码可读性降低,程序编写复杂,异常处理的代码也很苍白无力。因此,很有必要将这些检查异 常Exception和错误Error转换为RuntimeException异常,让程序员根据情况来决定是否捕获和处理所发生的异常。
    图中的三条线标识转换的方向,分三种情况:
    ①:Error到Exception:将错误转换为异常,并继续抛出。例如Spring WEB框架中,将org.springframework.web.servlet.DispatcherServlet的doDispatch()方法 中,将捕获的错误转译为一个NestedServletException异常。这样做的目的是为了最大限度挽回因错误发生带来的负面影响。因为一个 Error常常是很严重的错误,可能会引起系统挂起。
    ②:Exception到RuntimeException:将检查异常转换为RuntimeException可以让程序代码变得更优雅,让开发人员集中经理设计更合理的程序代码,反过来也增加了系统发生异常的可能性。
    ③:Error到RuntimeException:目的还是一样的。把所有的异常和错误转译为不检查异常,这样可以让代码更为简洁,还有利于对错误和异常信息的统一处理。
    1、 异常链
    异常链顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。Java API文档中给出了一个简单的模型:
    
 try {
     lowLevelOp();
    } catch (LowLevelException le) {
     throw (HighLevelException)
      new HighLevelException().initCause(le);
    }
当程序捕获到了一个底层异常le,在处理部分选择了继续抛出一个更高级别的新异常给此方法的调用者。这样异常的原因就会逐层传递。这样,位于高层的异常递 归调用getCause()方法,就可以遍历各层的异常原因。这就是Java异常链的原理。异常链的实际应用很少,发生异常时候逐层上抛不是个好注意,上 层拿到这些异常又能奈之何?而且异常逐层上抛会消耗大量资源,因为要保存一个完整的异常链信息。


注:顺着异常链可以找到原始异常:
package com.cognizant.chapter9;

import java.sql.SQLException;

class DAOException extends RuntimeException {
	public DAOException(String msg, Throwable cause) {
		super(msg, cause);
	}
}
class MyDAOException extends RuntimeException{
	public MyDAOException(String msg,Throwable cause){
		super(msg,cause);
	}
}

public class TestExceptionTransform {
	public static void main(String[] args){
		SQLException e= new SQLException();
		DAOException aa= new DAOException("FirstSQLException",e);
//		System.out.println(aa.getCause());
		
		MyDAOException bb= new MyDAOException("secondSQLException",aa);
		System.out.println(bb.getCause().getCause());
	}
}


分享到:
评论

相关推荐

    深入分析Java异常

    7. **异常链处理**:在企业级应用中,通常会通过异常转译来处理底层异常,即捕获底层异常后抛出一个包含用户友好信息的新异常。这样既避免了底层技术细节暴露,也为用户提供清晰的错误信息。 8. **最佳实践**:在...

    查看class文件工具

    3. **代码浏览**:在`jd-gui`中,用户可以逐行浏览反编译后的代码,查看方法体、异常处理和局部变量表等。这使得分析和调试变得简单。 4. **搜索功能**:`jd-gui`内置了搜索功能,可以快速定位到特定的方法或变量,...

    JavaScript常见面试题共41页.pdf.zip

    3. **对象与数组**:对象的创建、属性访问、原型链、深拷贝与浅拷贝、数组方法(push、pop、shift、unshift、splice、concat、slice等)。 4. **事件与DOM操作**:DOM元素的选择、操作、事件模型(捕获与冒泡)、...

    javascript与Cs互访及相关信息

    - 对象和原型链:理解对象属性的访问方式,以及原型继承的工作原理。 - 高阶函数:如map、reduce、filter等,用于数组操作。 - 异步编程:Promise、async/await的使用,处理回调地狱。 - 模块化:CommonJS、ES...

    基于ASP的广告点击计数器 v1.0.zip

    4. **错误处理**:编写异常处理代码,确保在出现错误时仍能正确处理请求,如数据库连接失败或SQL执行错误。 5. **性能优化**:为了应对大量点击,需要考虑性能优化,如使用缓存减少数据库访问,或者通过分布式计数...

    前端面试经验.zip

    - JavaScript:变量、数据类型、作用域、闭包、原型链,以及ES6及以上版本的新特性。 2. **JavaScript深入**: - DOM操作:选择元素,插入、删除节点,事件处理。 - 异步编程:回调函数,Promise,async/await。...

    AI人工智能技术的应用范围和案例[汇编].pdf

    A 是一家投资组合风险分析公司,专注于发现财务波动事件,帮助用户检测市场异常并量化金融扰动。A 分析引擎的深度数据算法利用主要数据源(世界金融交易所)和专有的无人监管机器学习技术。与其他竞争解决方案不同,...

    JavaScript權威指南第四版

    工程化与工具链 - **Webpack**:讨论Webpack打包工具的工作原理及其配置方法。 - **Babel**:了解Babel转译器的作用,即如何将现代JavaScript转换为浏览器兼容的代码。 - **Linting与测试**:介绍代码质量检查工具...

    维护的前端面试题库,包含不限于Vue面试题

    可能的题目包括Webpack配置、Babel转译、模块打包、代码压缩与优化、Git版本控制、持续集成/持续部署(CI/CD)流程等。 6. **CSS面试题**:CSS用于网页样式和布局。面试可能关注盒模型、选择器优先级、布局模式(如...

    AI人工智能技术的应用范围和案例 (2).docx

    A 是一家投资组合风险分析公司,专注于发现财务波动事件,帮助用户检测市场异常并量化金融扰动。A 分析引擎的深度数据算法利用主要数据源(世界金融交易所)和专有的无人监管机器学习技术。与其他竞争解决方案不同,...

    汤姆大叔-精通js系列

    1. 面向对象:JavaScript支持基于原型的面向对象编程,包括构造函数、原型链和实例化。 2. this关键字:this的值取决于函数调用时的上下文,理解其工作原理是解决许多JavaScript问题的关键。 3.闭包:闭包允许函数...

    若依后台管理系统

    操作日志:系统操作日志记录(含异常)。登录日志:系统登录情况记录(含异常)。在线用户:当前系统中活跃用户状态监控。连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。为何选择若依...

    Javascript中55个经典技巧

    15. **错误处理**:学会使用`try...catch`捕获和处理异常。 16. **DOM操作**:熟练使用`querySelector`, `querySelectorAll`, `addEventListener`, `removeEventListener`等DOM API。 17. **性能优化**:了解DOM...

    chessapp

    6. 工具链支持:TypeScript有着强大的工具链,包括Visual Studio Code、WebStorm等IDE的优秀支持,以及tsc编译器和npm脚本,可以方便地进行开发、构建和调试。 在"chessapp"的开发过程中,可能涉及到以下技术点: ...

    owasp top10漏洞讲解

    当应用程序在发送给浏览器的页面中包含未经适当验证或转译的用户提供的数据时,就可能发生跨站脚本(XSS)漏洞。这种漏洞允许攻击者向受害者的浏览器注入恶意脚本,从而执行各种恶意操作。 **危害:** 攻击者可以在...

    JavaScript 教程

    - **类与继承**:ES6引入了类的语法,支持面向对象编程,同时也支持原型链实现继承。 - **错误处理**:通过`try...catch`来捕获和处理程序中的异常。 - **模板字符串与正则表达式**:模板字符串简化了字符串拼接,...

    zhangfeidev.github.io:我的个人技术博客

    2. 高级概念:闭包、原型链、异步编程(Promise和async/await)。 3. 框架与库:React组件化开发、Vue的MVVM模式、Angular的依赖注入等。 4. 浏览器API:DOM操作、事件处理、Fetch API和XMLHttpRequest。 5. 工具和...

    agostinhobritojr.github.io:Agostinho的网站

    7. **JavaScript工具链**:Babel(转译ES6+到ES5)、Webpack(模块打包)、Gulp或Grunt(构建工具)等。 8. **前端性能优化**:如何利用JavaScript提高网页加载速度和用户体验,例如延迟加载、代码分割、缓存策略等...

    playground-bug-clinic:该停止停止调试了

    3. **Source Maps**:对于使用了Babel等工具进行转译的ES6+代码,源映射可以帮助我们在浏览器的开发者工具中看到原始的源代码,而不是转换后的版本,便于理解问题所在。 4. **try...catch**:通过异常处理结构,...

    servantvicariat

    5. **Try/Catch 嵌套改进**:现在可以捕获到内部 try 块抛出的异常。 **MYSQL 8** MySQL是世界上最受欢迎的关系型数据库管理系统之一。MySQL 8带来了许多改进,包括: 1. **窗口函数**:提供了新的分析功能,如 `...

Global site tag (gtag.js) - Google Analytics