• 献身说法---修复bug时的一些小技巧


    最近,修复了项目当中的一些bug,觉着有些思路可以分享出来供大家借鉴。

    场景一 开发环境中系统正常运行,测试环境中,部分机器未能正常运行。

    解决过程:远程连接了测试环境中的机器,观察了系统的运行情况,确实比较反常。查看日志后,发现出现了“xxx文件未找到”的异常。确认文件存在后,最先想到的就是,xxx依赖文件不存在,导致xxx文件未能正确加载。使用分析工具分析xxx文件依赖项后,发现测试环境确实是缺少了某些文件。从开发环境手动拷贝xxx文件的依赖文件到测试环境后,系统运行正常。

    划重点:同一份代码,A环境运行正常,B环境运行异常,最有可能的原因就是环境因素,比如网络原因,磁盘权限原因,运行库缺失等原因。具体的原因分析可以依赖软件系统的日志,如果日志比较详细合理的话,对于分析解决问题有着莫大的帮助。如果,由于一些原因,软件系统没有日志,也可以查看一下操作系统的应用程序日志。当然,操作系统的应用程序日志对一些软件系统崩溃会有记录,但一般的异常情况不会记录。

    场景二 逻辑A执行完毕后执行逻辑B,逻辑B执行完后执行逻辑C。逻辑A、B、C均放在try{}catch(){}块中,逻辑C未能正常执行。

    解决过程:走读代码发现,逻辑A当中使用了try{}catch(){}块,逻辑B当中也使用了try{}catch(){}块,理论上来说,逻辑C是可以正常运行的。

    private void MainFunc()
    {
        try
        {
            LogicA();
            LogicB();
            LogicC();
        }
        catch(Exception ex)
        {
            //Do someting
        }
    }
    
    private void LogicA()
    {
        try
        {
            //Do someting
        }
        catch(Exception ex)
        {
            //Do someting
        }
    }
    
    private void LogicB()
    {
        try
        {
            //Do someting
        }
        catch(Exception ex)
        {
            //Do someting
            throw ex;
        }
    }
    View Code

    再仔细查看后发现,逻辑B的catch(){}块中使用了throw 语句,当逻辑B中出现异常时,逻辑C自然就不会执行了。预期的结果是,逻辑C需要正常执行,采用的办法是将逻辑C放入finally{}块中,并记录是否有异常发生,如果有异常发生,进行提示或记录。

     1 private void MainFunc()
     2 {
     3     bool hasError;
     4     try
     5     {
     6         LogicA();
     7         LogicB();
     8         //LogicC();
     9     }
    10     catch(Exception ex)
    11     {
    12         //Do someting
    13         hasError = true;
    14     }
    15     finally
    16     {
    17         if(hasError)
    18         {
    19             //Do something
    20         }
    21         LogicC();
    22     }
    23 }
    View Code

    划重点:在进行异常处理时,除了使用try{}catch(){}块以外,必要的操作应该采用finally{}块操作,确保资源被释放,无论是文件句柄,网络连接还是窗口关闭等。如果发生了异常,应该给出合适的提示,让用户清晰的知道,操作未能成功完成。

    以上是修复bug过程中的一点儿小经验、小技巧,望大家笑纳。

  • 相关阅读:
    sys模块
    反射
    动态导入模块
    类的静态属性
    多态
    继承
    组合
    linux系统各个子目录的内容
    mysql安装
    Docker 数据卷操作
  • 原文地址:https://www.cnblogs.com/LightSmile/p/7604606.html
Copyright © 2020-2023  润新知