当前位置: 首页 > news >正文

献身说法---修复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过程中的一点儿小经验、小技巧,望大家笑纳。

转载于:https://www.cnblogs.com/LightSmile/p/7604606.html

相关文章:

  • 老调重弹-access注入过主机卫
  • awk 截取某段时间的日志
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • windows下VisualStudio和QtCreator搭建Qt开发环境
  • mysql 基础学习1
  • Spring第一个helloWorld
  • 剑指offer十五之反转链表
  • 数据库 之 创建,删除,查看 数据库
  • 张高兴的 Windows 10 IoT 开发笔记:ToF Sensor VL53L0X
  • 积分计算题
  • poj2420 A Star not a Tree?
  • 数据结构(一)
  • C++类对应的内存结构
  • PM2 常用命令
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • es6要点
  • Hibernate最全面试题
  • Java深入 - 深入理解Java集合
  • js数组之filter
  • js学习笔记
  • Logstash 参考指南(目录)
  • react 代码优化(一) ——事件处理
  • Theano - 导数
  • 给初学者:JavaScript 中数组操作注意点
  • 前嗅ForeSpider中数据浏览界面介绍
  • 双管齐下,VMware的容器新战略
  • 用jQuery怎么做到前后端分离
  • RDS-Mysql 物理备份恢复到本地数据库上
  • # 安徽锐锋科技IDMS系统简介
  • (09)Hive——CTE 公共表达式
  • (1)bark-ml
  • (2015)JS ES6 必知的十个 特性
  • (4)Elastix图像配准:3D图像
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (过滤器)Filter和(监听器)listener
  • (汇总)os模块以及shutil模块对文件的操作
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (蓝桥杯每日一题)love
  • (南京观海微电子)——COF介绍
  • (五)MySQL的备份及恢复
  • (转)memcache、redis缓存
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET Core 中的路径问题
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Standard 的管理策略
  • .Net Web窗口页属性
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 中viewstate的原理和使用
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @在php中起什么作用?