首页 > 代码库 > 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中的一段代码赏析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。