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); } }