zoukankan      html  css  js  c++  java
  • 异常处理

    1、线上代码不要使用printStackTrace();

    写完代码后请一定要检查下,代码中千万不要有printStackTrace()。因为printStackTrace()只会在控制台上输出错误的堆栈信息,他只适合于用来代码调试。真正需要记录异常,请使用日志记录。

    2、永远不要在catch块中吞掉异常

    catch (NoSuchMethodException e) {
         return null;
      }

    永远不要不处理异常,而是返回null,这样异常就会被吞掉,无法获取到任何失败信息,会给日后的问题排查带来巨大困难!!!!

    3、在需要的地方声明特定的受检异常

     public void foo() throws Exception { //错误做法
      }

    一定要尽量避免上面的代码,因为他的调用者完全不知道错误的原因到底是什么。在方法声明中,可以由方法抛出一些特定受检异常。如果有多个,那就分别抛出多个,这样这个方法的使用者才会分别针对每个异常做特定的处理,从而避免发生故障。

    public void foo() throws SpecificException1, SpecificException2 { 
    //正确做法
    }
    ### 始终只捕获那些可以处理的异常
    
    catch (NoSuchMethodException e) 
    {
        throw e; //这代码一点用都没有
    }
    

      这是一个基本概念,当你能够处理他时,你再捕获这个异常,否则永远都不要捕获他。如果你不能在catch块中处理它,那么就不要先捕获再直接抛出,这样没有任何意义。

    4、尽量捕获特定的子类,而不是直接捕获Exception类

    try {
          someMethod();
      } 
      catch (Exception e) 
      {
          LOGGER.error("method has failed", e);
      }

    5、永远不要捕获Throwable类

    这是一个严重的问题,因为Java中的Error也可以是Throwable的子类。但是Error是Java虚拟机本身无法控制的。Java虚拟机甚至可能不会在出现任何错误时请求用户的catch子句。

    6、始终在自定义异常中覆盖原有的异常,这样堆栈跟踪就不会丢失

     catch (NoSuchMethodException e) 
      {
      throw new MyServiceException("Some information: " + e.getMessage());  //错误做法
      }

    上面的命令可能会丢失掉主异常的堆栈跟踪。正确的方法是:

    catch (NoSuchMethodException e) {
         throw new MyServiceException("Some information: " , e);  //正确做法
    }

    7、可以记录异常或抛出异常,但不要同时做

    catch (NoSuchMethodException e) {
         LOGGER.error("Some information", e);
         throw e;
      }

    如上面的代码所示,抛出和日志记录可能会在日志文件中产生多个日志消息。这就会导致同一个问题,却在日志中有很多不同的错误信息,使得开发人员陷入混乱。

    8、永远不要在finally中抛出异常

    try {
      someMethod();  //抛出 exceptionOne
    }
     finally
    {
      cleanUp();    //如果在这里再抛出一个异常,那么try中的exceptionOne将会丢失forever
    }

    9、如果您不打算处理异常,请使用finally块而不是catch块

    try {
      someMethod(); 
    } 
    finally
    {
      cleanUp();    
    }

    这也是一个很好的实践。如果在你的方法中访问其他方法,而该方法抛出了异常你不想处理,但是仍然需要做一些清理工作,那么在finally块中进行清理。不要使用catch块。

  • 相关阅读:
    替代传统C/S和B/S技术的下一代客户/服务器编程技术
    理想的编程语言
    nginx进程模型
    Sybase 7.0 中文乱码问题
    netfilter 链接跟踪机制与NAT原理
    TraTraffic Server 进程模型
    nginx并发模型与traffic_server并发模型简单比较
    vs/nat原理分析
    ORACLE 查询表信息
    in 跟exists的区别
  • 原文地址:https://www.cnblogs.com/lqh969696/p/13716706.html
Copyright © 2011-2022 走看看