美文网首页
一文读懂系列-Exception和Error

一文读懂系列-Exception和Error

作者: monkey01 | 来源:发表于2018-08-20 09:08 被阅读57次

    有段时间没更新一文读懂系列了,这个系列主要还是帮大家梳理一些大家日常都会用到,都了解但是理解不透彻的一些知识点,今天介绍下Java的Exception和Error。
    Exception和Error都是我们在日常Java开发中每天必遇到的,大家都知道可以对Exception有两种做法要么try-catch,要么throw到上层去处理,但是大家是不是对这两种处理方法有什么区别?遇到Exception该如何处理?Exception和Error区别?都不能解释的太清楚,如果你解释不清,那么请继续往下看,我们就这些问题进行阐述,让大家能够真正理解Exception和Error。

    Exception和Error区别

    Exception和Error都继承自Throwable,在Java中体系中只有继承了Throwable的实例对象才可以被throw或catch。Exception是程序运行过程中可以预料的意外,可能应该被捕获进行相应的处理,Exception分为可检查异常和不可检查异常,可检查异常在源码里必须显式进行捕获一般IDE也都会提示我们进行捕获或抛出,不检查异常就是最常见的运行时异常,这类错误只有在运行的过程中才会发生,例如NullPointException、IndexOutOfBoundException之类的。Error是指在正常情况下,不太可能出现的情况,大部分的Error都会导致程序Crash不可恢复,所以这类Error一般不需要进行catch。

    Exception应该怎么处理

    1)catch明确的异常类型

    在catch异常的时候尽量捕获类型明确的异常,不要为了省事同意捕获Exception,这样很容易捕获我们不希望捕获的异常,因为有些异常我们是希望能够抛出的而不是捕获进行处理。

    2)不要捕获Error

    因为Error一般是我们无法恢复的异常,所以不要去捕获,我们一般是处理不了OutOfMemoryError之类的错误的。

    3)不要简单的在系统终端打印异常

    见过很多新手写的代码在catch代码块里只是将exception堆栈信息进行了简单的打印例如System.out.ptintln或者是e.printStackTrace,要知道在你自己开发电脑上这样是没问题的,你可以很方便的查看错误异常信息,但是这样的代码一旦上了生产环境,真的发生异常的时候我们还能看到吗?System.out是输出到console终端,可能在你启动的时候根本没有指定输出IO,e.printStackTrace是输出到标准错误流,但是生产环境可能你根本不知道标准错误流在哪里。

    所以对于异常还是最好乖乖的在自己的logger中记录下来,以备发生异常的时候可以在日志中查到。

    异常捕获性能影响

    1)try-catch代码会产生额外的性能开销,会影响到JVM对代码的优化,所以建议只捕获有必要的代码段,不要整段代码都放到try中。

    2)实例化一个Exception都会对当前的堆栈内容进行快照,这是非常消耗性能的操作,如果异常集中发生会对系统性能产生很大影响。

    统一异常处理

    为了避免开发人员在代码中随意处理异常,现在业界比较流行的一种做法就是对项目中的异常集中统一处理,开发人员只需要在业务代码中抛出异常就可以了,然后统一在一个ExceptionHandler中进行处理就可以了,Spring也提供了统一处理的相关类可以通过@RestControllerAdvice 类注解声明该类为统一异常处理类,那么所有抛出的异常只要没有被catch最终都会进到这个类中。

    当然异常进来后,我们还需要对相应的异常进行处理,Spring也提供了@ExceptionHandler注解可以方便的定义某种Exception类型的处理方法,这样就可以避免所有开发人员自成一套的异常处理方法了,统一在一个地方维护。

    @RestControllerAdvice
    public class HOPExceptionHandler {
        private Logger logger = LoggerFactory.getLogger(getClass());
        /**
         * 处理空指针异常
         */
        @ExceptionHandler(NullPointException.class)
        public Response handleHOPException(HOPException e){
            Response r = new Response();
            r.put("returnCode", e.getReturnCode());
            r.put("returnMsg", e.getReturnMsg());
            r.put("errorCode", e.getErrorCode());
            r.put("errorMsg", e.getErrorMsg());
            logger.error(new Date() + ": " + e.getMessage(), e);
            return r;
        }
    }
    

    总结

    上面介绍了下Java的Exception和Error的区别和常见的处理方案,现在对这两个类型是不是有比较深入的了解了,希望能够对大家有帮助。

    相关文章

      网友评论

          本文标题:一文读懂系列-Exception和Error

          本文链接:https://www.haomeiwen.com/subject/mtkkiftx.html