java异常设计

  • 异常的分类结构图
    • 异常机制是为了解决什么问题?

    它也是线程结束的一种方式,从某中角度来讲,它与正常return没有什么区别,只不过是一种异常的方式结束。那为什么需要这种异常的机制呢?异常机制本身也是划分了严重程度,如:Error/Exception. 它以一种不侵入正常流程编码的形式,尽量不让程序崩溃(Error类型的异常), 同时给开发者友好的提示信息(方便问题的定位)。

    • 各种异常在什么场景下出现?能否处理?

    Error错误

    这种异常通常都是程序级别的错误,直接会引起程序崩溃。

    常见的异常有:VirtualMachineError(jvm错误)、AWTError、OutOfMemoryError(堆内存溢出)、StackOverflowError(栈内存溢出)、NoClassDefFoundError、NoSuchMethodError。

    这种错误通常程序本身无法处理,需要对JVM优化处理,如:参数大小设置、引入依赖包等。

    RuntimeException运行时异常

    这种异常通常都是在程序运行的过程中出现的异常。要么是BUG,要么是参数错误,而这一切的异常情况在编码的时候根本无法预料。会让单个方法的调用直接异常结束.

    常见的异常有:IllegalArgumentException(不合法参数异常)、IllegalAccessException(不合法的访问)、ClassCastException(类型转换异常)、IndexOutOfBoundsException(边界异常)、NumberFormatException(数字格式异常).

    运行时异常通常有传入的参数错误或程序BUG引起,这种异常需要用户或开发者根据提示信息来修改问题。

    CheckedException检查型异常

    非运行时异常,是在编码时显示定义的异常,这种异常必须捕获(try catch)或抛出(throws),否则编译时无法通过。

    常见的异常有:IOException(IO异常,如:SocketException网络异常,文件流异常)、SQLException(sql异常).

    检查型异常,通常都是可预见的异常情况,而在编码的时候进行的一种补救措施。

    • 根据什么来设计异常?

    根据异常类型来设计

    Error错误类型的异常,通常都属于系统级别的问题. 除非我们要去终止整个进程,否则我们一般都不会涉及到此类的异常设计;

    CheckedException可检查型异常,属于应用编码级别的问题.它属于一种备用手段,比如:SocketException/FileException,捕获之后,还可以进一步的补救.我认为它属于一个另类的编程思想.

    RuntimeException运行时异常,属于请求级别/一次方法调用的问题. 在程序处理的时候,总会有想不周全的问题.比如:用户传入的参数不正确;开发者的BUG;这种问题通常都会中止此次请求或方法调用,返回错误提示信息,然后再由对应的人员去解决.

    根据谁造成的问题谁来解决的原则

    引起异常问题的原因无非两种:客户和开发者.

    当我们的应用内存不够或磁盘空间不足或系统宕机,这种出现系统级别的错误. 只能由运维或开发者来解决,对于客户来说并不可见,也并不关心.

    当我们的应用某个方法中的片段代码,因为开发者的疏忽,而非造成的BUG.这种问题只能由开发者来解决,对于客户来说并不可见,也不关心.

    当客户调用某个方法时,传入的参数不正确或数据不正确,这种问题只能由客户来解决,而开发者只需要友好的提示给客户.

    • 异常的设计样例
    /**
     * 程序BUG出现的异常.用于开发者定位问题所在.
     * @author yangyc
     */
    public class AppException extends RuntimeException{
    
        public AppException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    /**
     * 提示性异常.由调用者来解决.如果参数为空,参数格式不正确,数据获取不到等.
     * @author yangyc
     */
    public class PromptException extends RuntimeException {
        public PromptException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    /**
     * 远程调用服务的异常.这种在编码期就可以预料到的问题.
     * @author yangyc
     */
    public class RpcException extends Exception {
        public RpcException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    • 使用异常技巧

    1.什么时候使用检查型异常或运行时异常?

    异常可预见或可补救的情况,采用检查型异常,从编码的角度增强程序的健壮性. 相反无法预料, 问题出现就必须中止的问题,采用运行时异常.

    2.异常什么时候捕获?

    通常在调用起点捕获或AOP的更上层统一处理,中间不要去捕获; 明确知道问题并可以对此类异常处理,则捕获,而这种类型的异常,通常都会进行异常转换,继续往上层抛出.

    3.异常捕获时,try catch的内容应该是多少?

    一般不宜将捕获的代码太长,会影响异常处理机制的复杂度;同时,也应考虑将紧密代码放在一起,保证代码的可读性.

    4.异常的转换

    有些时候,捕获异常之后,会抛出一个新异常,继续由后续程序处理.这时,就需要进行异常的转换.比如:将检查型异常转换成运行时异常.

    5.异常的传递

    当出现异常转换时,要注意原始异常信息不丢失.应该使用 new XxxException(msg, e)这个方法.

    6.尽早抛出异常,尽晚的捕获异常,明确的抛出异常类型

    7.捕获异常后,不要忽略异常

    public void doNotIgnoreExceptions() {
        try {
            // do something
        } catch (NumberFormatException e) {
            // this will never happen
        }
    }

    8.不要捕获Throwable

    Throwable是所有异常(Exception)和错误(Error)的父类,虽然它能在catch从句中使用,但永远都不要这样做!如果你在catch从句中使用了Throwable,它将不仅捕获所有异常,它还将捕获所有错误,错误是由JVM抛出的,用来表明不打算让应用来处理的严重错误。OutOfMemoryError和StackOverflowError便是典型的例子,它们都是由于一些超出应用处理范围的情况导致的。

    https://www.cnblogs.com/beatIteWeNerverGiveUp/p/5915255.html

    原文地址:http://blog.51cto.com/881206524/2150012

    时间: 2024-08-04 12:04:44

    java异常设计的相关文章

    Java异常(1)

    一.要达到的效果 如果出现错误而是某些操作没有完成,程序应该: (1)返回到一种安全状态,并能够让用户执行一些其他的命令. (2)允许用户保存所有操作的结果,并以适当的方式终止程序. 异常处理的任务就是将控制权从错误产生的地方转移到能够处理这种情况的错误处理器   二.异常分类: 1.Throwable - ---------Error -     - -     ------- XXXX -      - -      ----- XXXXX ---Exception -      - -  

    2.Java异常学习

    1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ throw new Exception(); } b.捕获异常 catch(Exception e){ //异常处理程序 } c.finally代码块 必须注意的是:在finally块中不能抛出异常. finally{ //一定会被执行 //除非catch中有System.exit(0);会推出Java

    java异常面试常见题目

    在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的常客.关于Java中Error和Exception的面试题目多是关于Exception和Error的概念,如何处理Exception,以及 处理Exception时需要遵守的最佳实践等等.尽管关于多线程.垃圾回收.JVM概念和面向对象设计等方面的问题依然主宰着这类面试,你仍然需要为回答

    Java异常总结

    http://blog.csdn.net/hguisu/article/details/6155636 [-] 1 引子 2JAVA异常 4处理异常机制 1 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 2 抛出异常 throws抛出异常 使用throw抛出异常 4 Throwable类中的常用方法 5Java常见异常 ru

    Java异常初步

    所谓异常就是程序在运行时出现的不正常情况; 1.异常的体系: Throwable: 1) Error:通常指JVM出现重大问题如:运行的类不存在或者内存溢出等,这种异常是程序员无法处理的 2) Exception:在运行时运行出现的一些情况,可以通过try,catch,finally处理.比如在计算除法时把除数置0,参数传值是类型不符等. Java异常其实是对不正常情况的一种描述,并将其封装成对象 Java在 设计异常体系时,将容易出现的异常情况都封装成了对象 下面的代码在运行时会将除数置0,在

    浅谈java异常[Exception]

    本文转自:focusJ 一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也

    有效处理Java异常三原则

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? 在有效使用异常的情况下,异常类型回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么"会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们.有三个原则可以帮助你在调试过程中最大限度地使用好异常,这三个原则是:

    Java 异常基础 Exception

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. [java] view plaincopyprint? <span s

    JAVA基础教程之JAVA异常机制

    今天我们主要来说一说JAVA异常机制方面的内容.自设JAVA学习群457036818,大家可以交流一下 一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要传授的是一些滚与Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Java把异常当作对象来处理,而且定义一个基类java.lang.Throwable作为所有异常的超类.在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception.J