|
除虫随记
作者:Abbey
源代码下载:IPPortAbstractor.rar(8KB) 逆风编程精品
摘要 本文讲述了本人在编写一个IP:Port提取器过程中发现 Bug 并最终排除它们的过程,并解释了原理。
关键字 VC# 正则表达式 调试
我最近在看正则表达式,加之本人又是一个 CSer,于是想着利用正则表达式从文件中提取 IP:Port
这样的服务器地址,于是便有了昨天写的这个项目(不要被它的项目名称迷惑,我本来要做个关机程序 Shutdown 的,后来才改做这个
IPPortAbstractor 的)。先看看它的界面吧。
接着我完成了最初的代码,在调试过程中发现了以下几个Bug:
1、ProcessMatch() 成员中:
Bug-1:下面这样并不会引发编译错误,但是 StringBuilder 数组的数据元素需要另行 new
,因此在运行时会触发异常“源数组中至少有一个元素无法被向下转换到目标数组类型。”我想我是把 string 与 StringBuilder
看得太简单了。
textlineList.CopyTo(strArray);
正确的做法是利用循环,如下:
for (int i = 0; i< textlineList.Count; i)
strArray[i] = new StringBuilder((string) textlineList[i]);
Bug-2:这样也不会引发编译错误,但会触发异常“指定的转换无效。”我看上面的转换都成功了,这里为什么就不行呢?不得其解,还请各位解释一下
matches = m_regexIPPort.Matches((string)textlineList[i]);
正确的做法是利用 object.ToString() 函数,如下:
matches = m_regexIPPort.Matches(textlineList[i].ToString());
2、buttonDelete_Click() 成员中
Bug-3:在这里,我想把用户在 Listbox 中的选中行删除,最先用的是这样的 for 循环,结果会发生无法一次性将多个选中行删除的现象
for (int i = 0; i < listboxResult.SelectedIndices.Count; i)
{
m_IPPortList.Remove(listboxResult.SelectedItems[i].ToString());
listboxResult.Items.Remove(listboxResult.SelectedItems[i]);
}
正确的做法如下,这也是我想到的最简单的办法了。 Bug 的产生原因在于 SelectedIndices.Count 在 Remove
操作后会发生变化,从而导致 i 的值发生变化,因此不能使用 for 循环。 while ((i = listboxResult.SelectedIndices.Count) > 0)
{
// 切记:下面两条语句顺序不能颠倒
// listboxResult.Items.Remove 删除元素后将导致 m_IPPortList.Remove
// 无法定位,也会触发异常“索引超出了数组界限。”
m_IPPortList.Remove(listboxResult.SelectedItems[i-1].ToString());
listboxResult.Items.Remove(listboxResult.SelectedItems[i-1]);
}
3、保存搜索结果时一系列的 Bug
这里连续的 Bug
是项目中我最头疼的。本想在点击“退出”后弹出对话框,提示用户保存搜索结果。选择“是”进行保存,选择“否”直接退出,选择“取消”返回程序。最早
buttonExit_Click() 主要内容是这样的:
if (!IsSaved)
{
result = MessageBox.Show("搜索结果还没有保存,是否进行保存?", "保存搜索结果",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (result)
{
case DialogResult.Yes: //要保存
buttonSaveResult_Click(sender, e);
Close();
break;
case DialogResult.No: //不保存
Close();
break;
case DialogResult.Cancel: //返回程序,暂不退出
break;
default:
break;
}
} 本文章更多内容:1 - 2 - 下一页>> |