• JAVA异常处理原则和log4j输出详细异常分析


    1.多用try,catch;不要一个try,catch包含所有内容

       好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行

     

    2.多写几个catche;尽量不要使用Exception这个大异常去包容所有异常

       不要为了追求代码的简练,try,catch只写一个,使用Exception去抓取所有可能的异常,这只是理想状态,程序出错不是直接打印出来异常就完事了,应该在catche抓取异常的同时一方面给程序员输出错误日志,一方面做些处理反馈给用户,比如一些提示错误框或者错误页面,不能让用户不知道所以然但是系统没有正常进行。

       综上所述,应该多使用几个catche块去抓取不同异常,然后做不同处理,返回给用户,尽量不同异常使用不同cacht块抓取别一个Exception抓取所有异常;

     

    3.通过测试来谈谈java常见异常打印的区别

    packagecom.hudong.test;

    importorg.apache.commons.logging.Log;

    importorg.apache.commons.logging.LogFactory;

     

    public class TryCatchTest{

     

        private final static Log logger =LogFactory.getLog(TryCatchTest.class);

        public static void main(String[] args) {

            try {

                System.out.println(1 / 0);

            } catch (Exception e) {

                logger.error("---fill---:" +e.fillInStackTrace());

                logger.error("----------美丽的分割线---------");

                logger.error("---msg---:"+ e.getMessage());

                logger.error("----------美丽的分割线---------");

                logger.error("---e---:" +e.toString());

    logger.error("---e===e---:"+ e);

                System.out.println("===============");

                System.out.println(e.toString());

               System.out.println("--------------------");

                System.out.println(e.getMessage());

               System.out.println("--------------------");

                e.printStackTrace();

                System.out.println("--------------------");

               System.out.println("---fill---:"+e.fillInStackTrace());

                System.out.println("===============");

            }

    try {

               System.out.println(1 / 0);

           } catch (Exception e) {

               try {

                    throw e;

                    // throw e.fillInStackTrace();

               } catch (Throwable e1) {

                    e1.printStackTrace();

               }

           }

        }

    }

    关于java异常的打印网上有很多资料,关于log4j日志的异常输出也有很多资料;但是今天突然想到一个问题:几种异常打印的区别,以及哪种可以打印出详细的异常轨迹 和指定错误行;网上却没找到确切的说法和资料;所以自己写了个测试小程序,通过查资料确认得出以下结论:

    1.上面案例的测试只有两种情况可以打印出详细错误堆栈信息:

    logger.error("---e===e---:"+ e);

    throw e;

    第一种是log4j定义的error(message,e)方法实现的打印详细信息;第二种是java自带的抛出详细异常的方式;经过测试只有这两种可以打印出详细的堆栈轨印,其他方式都只输出错误信息。

    2. throw e与throwe.fillInStackTrace()的区别

        前者输出了详细的错误代码行;后者只输出抛出异常的位置,并未打印出错误代码行的位置,即e.fillInStackTrace()所在地额代码行;所以相对来说,如果想要清楚的抛出错误信息应该使用前者。

    3.logger.error("---e===e---:" + e)与logger.error("---fill---:" +e.fillInStackTrace())的区别;

       throw、throwe.fillInStackTrace()两个都可以打印出详细异常,与不同的是,log4j前者方式打印的出详细异常并指向错误代码行,而后者不会打印详细堆栈。

    4.fillInStackTrace输出信息查看

    如果调用e.fillInStackTrace() ,表示重新填充stack里面的信息,那就会丢失低s一级环境的违例对象的信息。如果重新new 一个违例也丢失低一级的违例对象的信息。

     

  • 相关阅读:
    面试范围
    Spark集群基础概念 与 spark架构原理
    RDD 算子补充
    常用Actoin算子 与 内存管理 、共享变量、内存机制
    常用Transformation算子
    spark core (二)
    Spark 介绍
    JSON对象和string的相互转换
    javascript中substring和substr方法
    mongodb学习相关网址
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016697.html
Copyright © 2020-2023  润新知