随笔- 88  评论- 433  文章- 13 

.NET 异常捕获机制的小技巧应用(实例:端口扫描程序)

要使用.NET 异常捕获机制的模型很简单,见如下代码

             try
            
{
                
if(somecodition)
                    
throw Exception;
                
else
                    
//do somthing else
            }

            
catch(Exception e)
            
{
                
//do something
            }

            
finally
            
{
            }

      异常处理就是C# 为处理错误情况提供的一种机制。它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来。
   简单来说,已知或者未知的错误,通过异常捕获机制都能得到合适的处理。


这里要介绍的是异常捕获机制的一点小小的技巧应用
  

//扫描端口
            int iStart=(int)this.numericUpDown1.Value;
            
int iEnd=(int)this.numericUpDown2.Value;
            
try
            
{
                
this.progressBar1.Minimum=iStart;
                
this.progressBar1.Maximum=iEnd;
                
this.richTextBox1.Text="程序开始扫描端口:\n";    
                
this.richTextBox1.Update();
                
for(int i=iStart ;i<iEnd;i++)
                
{
                    
this.progressBar1.Value=i;
                    TcpClient MyTCP
=null;                        
                    
try
                    
{
                        MyTCP 
= new TcpClient(this.textBox1.Text,i);
                        
this.richTextBox1.Text+="端口 " + i.ToString() + " 开放!\n";
                        
this.richTextBox1.Update();
                    }
            
                    
catch
                    
{
                    }
            
                }

                
this.richTextBox1.Text+="扫描端口结束!\n";            
            }

            
catch(Exception Err)
            
{
                MessageBox.Show(
"扫描端口操作发生错误,错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }

        }

    上面的代码,有两层try-catch,我们看里面一层,我们发现里面一层的catch没有做处理,
也就是说,这里会捕获到try语句块中的异常,即实例化一个TcpClient对象的异常。
我们知道要实例化一个TcpClient对象需要两个参数,第一个IP地址,第二个端口号,两者结合起来标示一个网络设备。
    如果端口被占用了,就不能实例化我们的TcpClient对象,当然会抛出异常;而此时,异常被内层的try-catch捕获到,所以程序不会中断其运行状态,继续执行我们未结束的for循环。
也就是为什么我们的端口扫描程序会产生如下图效果的原因


    大家可以联想到,是不是还有很多地方值得用这种比较巧妙的方法呢?
    我做过的例子中,有个判断字符是否合法化的问题,用的也是这种方法。
    当然在某些特定的场合,大家也许会发现这种小技巧更合用!

最后有点值得说明的是,根据我的经验这种做法有时候是以消耗时间为代价的,大家慎重选择!

posted on 2006-02-13 17:14  秋雨飘飞  阅读(1119)  评论(1编辑  收藏