• 封装异常处理之坑


        public static void main(String []f) {
            try {
                test();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static void test() {
            try {
                int i = 1 / 0;
            } catch (Exception e) {
                throw new RuntimeException("hh");
            }
        }
    

      

    java.lang.RuntimeException: hh  msg遗失

    at com.citi.risk.scef.limitexposure.config.exception.DBException.test(DBException.java:39)    第一堆栈:throw new RuntimeException("hh");遗失了第一现场
    at com.citi.risk.scef.limitexposure.config.exception.DBException.main(DBException.java:29)

    小结:msg遗失,堆栈第一现场遗失

     项目中做了修复:

    -===========================================

        private static void test() {
            try {
                int i = 1 / 0;
            } catch (Exception e) {
                throw new RuntimeException("hh", e);
            }
        }
    

      

    java.lang.RuntimeException: hh
    at com.citi.risk.scef.limitexposure.config.exception.DBException.test(DBException.java:39)  第一堆栈仍然是throw new RuntimeException("hh")
    at com.citi.risk.scef.limitexposure.config.exception.DBException.main(DBException.java:29)
    Caused by: java.lang.ArithmeticException: / by zero
    at com.citi.risk.scef.limitexposure.config.exception.DBException.test(DBException.java:37)   好在第一现场出现在Caused By中,但莫名其妙堆栈变长了,不利于查看
    ... 1 more

    msg遗失,但仍可在Caused By中,找到堆栈第一现场

        private static void test() {
            try {
                int i = 1 / 0;
            } catch (Exception e) {
                throw e;
            }
        }
    

      

    java.lang.ArithmeticException: / by zero
    at com.citi.risk.scef.limitexposure.config.exception.DBException.test(DBException.java:37)  第一堆栈为1/0
    at com.citi.risk.scef.limitexposure.config.exception.DBException.main(DBException.java:29)

    msg原汁原味,堆栈第一现场在第一行

    实践中

    1)优先直接抛原始异常

    2)若就是需要封装原始异常,务必将原始异常e传入封装异常,否则遭到堆栈第一现场遗失

  • 相关阅读:
    javascript判断触发事件event的鼠标按钮
    解决IE8 Session共享问题
    SignalR 实现web浏览器客户端与服务端的推送功能
    MFC ActiveX控件与ATL ActiveX控件的比较 .
    rpm relevent operation record
    通过rpm包安装、配置及卸载mysql的详细过程 Richard Shen 运维/架构 51CTO技术博客
    instal python relevent cmds
    ubuntu日志的设置
    关于电信、网通检测ADSL共享上网的技术手段
    Simple usage of Python's logging module
  • 原文地址:https://www.cnblogs.com/silyvin/p/13195116.html
Copyright © 2020-2023  润新知