找到根因,才能从根本上解决问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://elastic.blog.csdn.net/article/details/39449391

找到根因,才能从根本上解决问题

       源自我参与的一个项目在用户那里出了bug,当然非我的改动引发,是之前处理数据未考虑到异常。

      一、Bug描述

      公式即:优化数据=出口1flow1-出口2flow2,优化比例=优化数据/出口1flow1

      正如上表黄色标注所示,bug表象是优化数据为负值,优化比例为负值。用户一看还了得,还不如不去优化?

      二、Bug临时补救方案

      分析发现,不是所有应用识别都会出错,只有极其个别的情况。并且这种逻辑,近几年就跑出一回。所以,我们的方案是,当出口2flow2>出口1flow1的时候,就置出口2flow2 =出口1flow1。这样就绝对不会出现优化数和优化比例为负数的情况。

      三、Bug补救后仍存在隐患

       隐患1:所有上面的出口1、出口2的数据是从mysql数据库中读取的,包含合计数据。合计和应用1-9共用一套逻辑,所以导致纠错时,如果出现出口2比出口1大的情况,置出口2=出口1的数据。这样就会出现出口2列的应用1-应用9的求和与出口2合计不等的隐患。

      补救隐患1:只有出口2列对应的合计行出错,真正的和应该等于应用1+…+应用9。想到的方案是不是从数据库中读取,而是进行应用1到应用9求和

      补救隐患1后的隐患:我们保证了不出现异常数据,保证求和正确,用户看着没有问题,但作为工程师,就要扒一扒为什么会出现上面的异常数据

     四、找到根因

     讨论分析发现,是我们的应用识别驱动问题出了问题,导致讲大量出口1的数据识别为出口2的数据。即是下图的分类识别数据出了错。

 

     五、总结

      很小很小的bug,但是带来很大很大的灾难性不可饶恕的问题,这种我们自身验证和测试是几年也跑不出这种异常数据的。但是,我们对异常的把控是做的远远不够的,其实除了常用的除数为0的情况,对于这种优化数据良不能为负数的情况也必须敲响警钟!

      程序设计中要做出异常处理机制,或者跑出异常、或者打印错误日志,或者其他方法,但是一定要去做,要去处理,异常的场景考虑的越全面越好,异常的处理机制对应的越多越好。

      谨记!

      2014-9-21am10:30思于家中床前

 

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/39449391

如果感觉本文对您有帮助,请点击支持一下,您的支持是我坚持写作最大的动力,谢谢!

 

展开阅读全文

import java.servlet.*如何才能找到?

05-10

jswdk-1.0.1安装成功了;servlet.jar也分别加到classpath中,复制到jdk\jre\lib中了,还是不能编译.rn 请问下面这个程序如何才能运行?rn import java.servlet.*;rnimport java.servlet.http.*;rnimport javax.servlet.io;rnimport javax.servlet.util;rnpublic class ReqInfoServlet extends HttpServletrnrnpublic void service(HttpServletRequst req,HttpServletResponse res)rnthrows IOExceptionrnrnServletOutputStream os;rnEnumeration paramValue;rnString paramName,paramValue;rnEnumeration hdrNames;rnString hdrDate,hdrName,hdrValue;rnres.setContentType("text/plain");rnPrintWrite pw = new PrintWrite(res.getOutputStream());rnpw.println("Request protocol is "+rnreq.getPotocol());rnpw.println("Request scheme is "+req.getScheme());rnpw.println("Remote host is "+req.getRemoteHost());rnpw.println("Remote address is "+req.getScheme());rnpw.println("Receiving server is "+ req.getServerName()+"on oprt number"+req.getServerPort());rnpw.println();rnpw.println("Header data is :");rnwhile(hdrNames.hasMoreElements())rnrnhdrName=(String)hdrNames.nextElement();rngdrValue=(String)req.getHeader(hdrName);rnpw.println("name="+hdrName+"; value="+hdrValue);rnrnpw.println();rnparamNames=req.getParameterNames();rnwhile(hdrNames.hasMoreElements)rnrnhdrName=(String)hdrName.nextElement();rnhdrValue=(String)req.getHeader(hdrName);rnpw.println("name="+hdrName+";value="+hdrValue);rnrnpw.println();rnparamNames=req.getParameterNames();rnpw.println("Request parameters are:");rnwhile(paramNames.hasMoreElements())rnrnparamName=(String)paramName.nextElement();rnparamValue=(String)req.getParameter(paramName);rnpe.println("name="+paramName+";value="+paramValue);rnrnpw.flush();rnpw.close();rnrnrnrn先表示感谢!rn 论坛

加班,解决问题才能走人,求救诸位

04-05

以下代码产生堆栈溢出,为何?rnrn就是建立了一个DataSet 的属性,然后给它赋值的时候就陷入了堆栈嵌套中。。rnrnrnusing System;rnusing System.Drawing;rnusing System.Collections;rnusing System.ComponentModel;rnusing System.Windows.Forms;rnusing System.Data;rnrnnamespace WindowsApplication49rnrn /// rn /// Form1 的摘要说明。rn /// rn public class Form1 : System.Windows.Forms.Formrn rn private System.Windows.Forms.Button button1;rn /// rn /// 必需的设计器变量。rn /// rn private System.ComponentModel.Container components = null;rnrn public DataSet DSrn rn setrn rn DS = value;rnrn rn rnrn public Form1()rn rn //rn // Windows 窗体设计器支持所必需的rn //rn InitializeComponent();rnrn //rn // TODO: 在 InitializeComponent 调用后添加任何构造函数代码rn //rn rnrn /// rn /// 清理所有正在使用的资源。rn /// rn protected override void Dispose( bool disposing )rn rn if( disposing )rn rn if (components != null) rn rn components.Dispose();rn rn rn base.Dispose( disposing );rn rnrn #region Windows 窗体设计器生成的代码rn /// rn /// 设计器支持所需的方法 - 不要使用代码编辑器修改rn /// 此方法的内容。rn /// rn private void InitializeComponent()rn rn this.button1 = new System.Windows.Forms.Button();rn this.SuspendLayout();rn // rn // button1rn // rn this.button1.Location = new System.Drawing.Point(104, 72);rn this.button1.Name = "button1";rn this.button1.TabIndex = 0;rn this.button1.Text = "button1";rn this.button1.Click += new System.EventHandler(this.button1_Click);rn // rn // Form1rn // rn this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);rn this.ClientSize = new System.Drawing.Size(292, 273);rn this.Controls.Add(this.button1);rn this.Name = "Form1";rn this.Text = "Form1";rn this.ResumeLayout(false);rnrn rn #endregionrnrn /// rn /// 应用程序的主入口点。rn /// rn [STAThread]rn static void Main() rn rn Application.Run(new Form1());rn rnrn private void button1_Click(object sender, System.EventArgs e)rn rn DataSet ds = new DataSet();rn DS = ds;rn rn rnrnrnrn 论坛

DRM能否从根本上解决盗版问题呢?

03-08

据说DRM在很大程度上来源于防盗版技术。根据大家广为引用的原理大致上是基于非对称加密技术,通过在播放的时候去一个公信方获取播放的密钥并解密其内容然后播放的。rn如果这个理解基本正确的话,那么假设盗版者先通过合法途径获得一个整版的拷贝,然后合法地获取密钥。这样最起码,这个盗版者就可以通过技术手段将已加密的内容还原为未经过加密的内容。rn然后他只需要非法散布这个解密后的内容,不就仍然能够完成盗版了吗?rn如果说再加上水印技术,就是说内容中包含合法获得播放权限的人的唯一识别信息,在发现盗版后能够追查出版权泄漏的来源,似乎就能够解决上面提到的问题了。rn但事实远非如此简单。请考虑,如果追查泄漏者是为了进行惩罚,则需要法律支持这种主张,即泄漏者应当对泄漏负责。但是实际情况是这个世界上存在大量不懂得计算机技术的人,并且这些人大多没有多少保护意识,或者不具备在信息世界中保护自己的能力。如果他(她)的计算机被黑客攻击并取得了完全的控制权,那么完全有理由相信黑客能够获得这个可怜的整版用户的计算机上的任何内容,并用于制作和散播盗版。这样说来,这个人其实是受害者,而且往往他(她)也没有足够的能力从技术上帮助调查人员查找到攻击他(她)的黑客。而从法律角度讲,无法要求每个人都具备足够的技能在信息世界中保护自己。所以这种被标记为泄漏者应当受惩罚的主张最起码在可以预见的将来无法得到法律的支持。rn这么一来,盗版者其实还是能够很轻松地获得内容的来源并制造和传播盗版的内容。整个DRM体系仍然无法在根本上解决盗版问题。相应的,它在防盗版领域很可能只能为想使用整版的用户提供关于内容是否为整版的一个确认(当然在其它领域还是很有用处的),那么如果这个推想还算有道理的话,那么多大公司、研究机构、标准化组织如此积极地参与到DRM的研究和推动里来,他们的目的又在何处呢?rn也许我对DRM技术的根本原理的理解有错误才造成我的这个疑问,但我实在想听一听大家关于这个问题的高见。欢迎不吝赐教。 论坛

没有更多推荐了,返回首页