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             else
18             {
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             try
39             {
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);
            }
        }

  

posted @ 2016-09-09 19:05  micDavid  阅读(592)  评论(0编辑  收藏  举报