我遇到了一个bug,是客户测试我们的产品,报出来的,而且有异常信息文件,这对于定位问题,很有帮助。

我找到源码看了下,bug还无法重现。于是我随便点点客户端,经过了几次调试,结果报出错误来了。客户端界面如下:

代码如下:

  /// <summary>
/// 选定项发生改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView_EditBibliographys_SelectedIndexChanged(object sender, EventArgs e)
{ if (listView.SelectedItems.Count!= )
{
btnEdit.Enabled = false;
btnDelete.Enabled = false;
btnRenew.Enabled = false;
btnMoveDown.Enabled = false;
btnMoveUp.Enabled = false;
}
else
{
btnEdit.Enabled = true;
btnDelete.Enabled = true;
btnRenew.Enabled = true;
if (listView.SelectedIndices[] != listView.Items.Count - )
{
btnMoveDown.Enabled = true;
}
if (listView.SelectedIndices[] != )
{
btnMoveUp.Enabled = true;
}
}
Samson.NoteFirst.Model.RefStyle.Journal journal = Globals.Journals[Globals.MemoryDataKey];
setCheckBoxes(journal);
if (!isFirst)
{
PageSet();
CheckBoxSet();
}
try
{
index = listView.SelectedIndices[];
}
catch (Exception ex)
{
EventLogProcess.Write(ex);
}
}

代码解释下:9到30行的if   else 是控制编辑引文界面上右侧的按钮的启用和禁用。

40行是获取选中的引文的序号。就是这句报错了。调试发现,原来是listview集合为空,还要取第一项,那当然报错了。报错信息如下:

 <StackTrace>   在 System.Windows.Forms.ListView.SelectedIndexCollection.get_Item(Int32 index)
在 NoteFirst.KMS.Clients.OfficeAddin.EditBibilography.listView_EditBibliographys_SelectedIndexChanged(Object sender, EventArgs e)</StackTrace>
<Message>InvalidArgument=“0”的值对于“index”无效。

这段代码,第九行的判断,令人费解。listView.SelectedItems.Count!= 1,表达意图不明确。万一Count为0,面板右侧的按钮,还是启用状态,显然不合理,甚至会报错。第40行的代码,一点防卫意识都没有,就等着catch,你以为在try里面的东西,就全部安全了吗?try...catch,我认为是针对程序意外情况,你确实提前料想不到的异常处理。比如,读取文件的时候,或者打开数据库连接操作的时候,等等。c#中,经常要做的一个操作,便是判断一个对象是不是为null,或者判断参数的正确与否,如果把一些常规的东西,都包括这try块当中,这有什么意义呢?

以下是我改后的代码:

        /// <summary>
/// 选定项发生改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView_EditBibliographys_SelectedIndexChanged(object sender, EventArgs e)
{ if (listView.SelectedItems.Count == 0 || listView.SelectedItems.Count > 1)
{
btnEdit.Enabled = false;
btnDelete.Enabled = false;
btnRenew.Enabled = false;
btnMoveDown.Enabled = false;
btnMoveUp.Enabled = false;
}
else
{
btnEdit.Enabled = true;
btnDelete.Enabled = true;
btnRenew.Enabled = true;
if (listView.SelectedIndices[0] != listView.Items.Count - 1)
{
btnMoveDown.Enabled = true;
}
if (listView.SelectedIndices[0] != 0)
{
btnMoveUp.Enabled = true;
}
} try
{
if (listView.SelectedIndices.Count > 0)
{
index = listView.SelectedIndices[0];
}
}
catch (Exception ex)
{
EventLogProcess.Write(ex);
}
}

  

c# winform中的一段代码赏析的更多相关文章

  1. Qt源码包中的一段代码

    之所以单独拣出来是因为Qt的开发者们给普通开发者提供了高效编程的商业代码例子: bool QWidget::testAttribute_helper(Qt::WidgetAttribute attri ...

  2. WPF和Winform中picturebox图片局部放大

    原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...

  3. 《Focus On 3D Terrain Programming》中一段代码的注释三

    取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...

  4. 《Focus On 3D Terrain Programming》中一段代码的注释二

    取自<Focus On 3D Terrain Programming>中的一段: bool CTERRAIN::MakeTerrainFault( int iSize, int iIter ...

  5. 《Focus On 3D Terrain Programming》中一段代码的注释一

    取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...

  6. 怎么知道RTL Schematic中的instance与哪段代码对应呢

    2013-06-23 20:15:47 ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”.对于一个简单的设计,比如 ...

  7. javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数

    javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...

  8. js中闭包来实现bind函数的一段代码的分析

    今天研究了一下bind函数,发现apply和call还可以有这样的妙用,顺便巩固复习了闭包. var first_object = { num: 42 }; var second_object = { ...

  9. Winform 中写代码布局中遇到的控件遮盖问题

    在winform中编程时,需要动态向主窗体中增加菜单栏和用户控件,菜单栏需要设置DockStyle为Top ,而设置用户控件的DockStyle为Fill,之后在加载的时候,出现了菜单栏遮盖用户控件的 ...

随机推荐

  1. 【echarts3】--1 简单入门

    echarts3 相信大家都了解吧,是百度研发的 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8 ...

  2. mybatis like条件添加%的方法

    使用 MySQL可以使用CONCAT函数.例: <if test="userName != null and userName != ''"> and user_nam ...

  3. JPA数据懒加载LAZY和实时加载EAGER(二)

    懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句,抽取相关联数据.而实时加载则是执行完主查询后,不管是否 ...

  4. IOS 使用cocoapods后无法导入头文件问题

    IOS 使用cocoapods后无法导入头文件问题 这时候如果你发现import的时候没有提示AFN e t wo r k i n g.h的文件,可以在target-Build Settings下修改 ...

  5. python针对端口11211进行全网收集

    前言: 最近Memcached分布式系统DRDoS拒绝服务攻击 一夜之内流量暴增.各种网站给打挂.原先打算写 一个poc可惜失败了. 0x01 requests模块 0x02 去钟馗之眼注册一个账号, ...

  6. 1.1 Python是一种什么样的语言

    小时不识月,呼作白玉盘.很多人习惯地说Python不过是一种脚本语言而已,实际上这种说法是非常不准确的,完全不能体现出Python的强大.严格来说,Python是一门跨平台.开源.免费的解释型高级动态 ...

  7. ZOJ - 2477 dfs [kuangbin带你飞]专题二

    注意输入的处理,旋转操作打表.递增枚举可能步数,作为限制方便找到最短路. AC代码:90ms #include<cstdio> #include<cstring> char m ...

  8. OpenCV 之 空间滤波

    1  空间滤波 1.1  基本概念 空间域,在图像处理中,指的是像平面本身: 空间滤波,则是在像平面内,对像素值所进行的滤波处理. 如上图所示,假设点 (x, y) 为图像 f 中的任意点,中间正方形 ...

  9. SpringBoot SpringSecurity4整合,灵活权限配置,弃用注解方式.

    SpringSecurity 可以使用注解对方法进行细颗粒权限控制,但是很不灵活,必须在编码期间,就已经写死权限 其实关于SpringSecurity,大部分类都不需要重写,需要的只是妥善的配置. 每 ...

  10. C# 枚举特性 FlagAttribute 的应用

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟 ...