首页 > 代码库 > c# winform中的一段代码赏析

c# winform中的一段代码赏析

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

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

技术分享

代码如下:

 1  /// <summary> 2         /// 选定项发生改变事件 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="e"></param> 6         private void listView_EditBibliographys_SelectedIndexChanged(object sender, EventArgs e) 7         { 8  9             if (listView.SelectedItems.Count!= 1)10             {11                 btnEdit.Enabled = false;12                 btnDelete.Enabled = false;13                 btnRenew.Enabled = false;14                 btnMoveDown.Enabled = false;15                 btnMoveUp.Enabled = false;16             }17             else18             {19                 btnEdit.Enabled = true;20                 btnDelete.Enabled = true;21                 btnRenew.Enabled = true;22                 if (listView.SelectedIndices[0] != listView.Items.Count - 1)23                 {24                     btnMoveDown.Enabled = true;25                 }26                 if (listView.SelectedIndices[0] != 0)27                 {28                     btnMoveUp.Enabled = true;29                 }30             }31             Samson.NoteFirst.Model.RefStyle.Journal journal = Globals.Journals[Globals.MemoryDataKey];32             setCheckBoxes(journal);33             if (!isFirst)34             {35                 PageSet();36                 CheckBoxSet();37             }38             try39             {
40 index = listView.SelectedIndices[0];
41 }42 catch (Exception ex)43 {44 EventLogProcess.Write(ex);45 }46 }

代码解释下: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中的一段代码赏析