`
happmaoo
  • 浏览: 4309383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C#网络编程中的异常处理

阅读更多
目录 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

l 摘要

l 网络编程中异常出现场景

l 网络编程中的异常处理

l 小结

摘要

异常的处理是为了保证程序尽量在不可预知的意外情况正常运行,同时异常的处理也是比较繁琐的过程。在网络编程中,不可预知的情况更多,使得开发者在编程时需要编写大量的异常处理代码,本文介绍了C#中一种简单的异常处理方法,减少了开发者的麻烦。本文假设读者对C#的网络编程和委托比较熟悉。

网络编程中异常出现的场景

在编写程序的过程中,为了尽量让程序具有更好的稳定性,减少不可预知因数对程序运行时的影响,我们都需要大量的使用try..catch.. 来处理可能出现的异常。在网络程序的编写过程中,由于网络的不确定因素使得我们需要编写更多的异常处理代码。比如在一个文件传输的程序中,我们可能会出现如下的情形,

我们的程序结构可能会分为如下几层:界面用户操作层、中间的业务逻辑层、以及用来传输文件的Sockets操作层。相应得伪码如下:

// Sockets传输层

class FileSocket{

Public void TransferFile(Socket sock,string Filename,long filesize){

long total=0;

long rdby=0 ;

int len=0 ;

byte[] buffed = new byte[32767] ;

FileStream fin = new FileStream(filename,FileMode.Open , FileAccess.Read) ;

total=fin.Length;

NetworkStream nfs = new NetworkStream(sock) ;

while(rdby<total&&nfs.CanWrite)

{

len =fin.Read(buffed,0,buffed.Length) ;

nfs.Write(buffed, 0,len);

rdby=rdby+len ;

}

fin.Flush();

fin.Close();

return;

}

}

// 逻辑处理层

Class Logic{

FileSocket Fsocket;

Socket sockt;

long filelength;

Public void SendFile(string filename){

Fsocket.TransferFile(socket,filename,filelength);

}

}

// 界面层

Class Client{

Logic logic;

String filename;

Public void Send_Onclick(object o,EventArgs e){

Logic.SendFile(filename);

}

}

显然在上面的代码中我们可以发现,如果有异常发生,我们的程序就会直接崩溃。当然,我们可以通过处理异常的方法来达到让程序不崩溃的目的,比如在我们的最后的Socket传输层来通过Try.Catch来捕获异常。但是,带来的问题就是,作为调用该段代码的程序,比如Logic类中就必须知道异常已经发生。这样的话,我们的FileSocket中的TransferFile方法就必须返回一个值来表示是否发生异常,比如bool类型,或是int类型,同样的作为Logic的上一级调用者Client也必须来判断Logic中是否有异常,同样也需要来进行判断。如果我们的层数更多,或者调用关系更加复杂的话,我们在代码中,对于类似的处理就更加复杂以及麻烦。

如果我们需要在日志文件中记录异常发生的原因和类型以便调试的话,我们可以需要在上述的三个类中都必须进行相应的处理,这样的话,逻辑也显得比较混乱。

网络编程中的异常处理

在前面的场景中,我们已经非常清楚了在网络编程中异常的处理比较麻烦。如果调用关系比较复杂的话,我们对于代码处理和代码的控制就非常麻烦。同时在对异常的处理过程中,用户很可能会需要写入日志文件,写入系统日志,在界面上面显示等等不同操作,那么在不同的层次中捕捉异常了之后,基本很难实现用户这样的要求。

为了简化对异常的处理过程,达到对异常统一处理的目的,我们采用仅对最终调用层的异常进行统一处理,同时提供一个专门处理异常的类对捕获的异常进行操作。比如在上面的例子中,我们仅在最后的Client调用层来处理异常,对其它可能出现的异常不做捕获。

那么,如何让用户可以对捕获的异常进行不同的操作呢?我们可以采用委托来解决这个问题,由用户直接传入需要处理的方法名称,如显示在界面的函数,写入系统日志的函数等等。

因此,我们可以这样定义一个专门处理异常的类来解决这些问题,代码如下:

public delegate void MessageEventHander ();

public class ExceptionHandler{

private const string LOG_SOURCE_NAME = "yourname";

private const string LOG_SOURCE_LOG = "yourlog";

private MessageEventHandler m_showmessage;

public ExceptionHandler() : this(null)

{

}

public ExceptionHandler(MessageEventHandler ShowMessage){

m_showmessage = ShowMessage;

}

public void WriteLog(Exception ex){

if( ! EventLog.Exists( LOG_SOURCE_NAME)){

EventLog.CreateEventSource(LOG_SOURCE_NAME,LOG_SOURCE_LOG);

EventLog.WriteEntry(LOG_SOURCE_NAME,"Write new Log");

}

EventLog.WriteEntry(LOG_SOURCE_NAME,ex.ToString());

}

public static void Publish(Exception ex,MessageEventHandler ShowMessage){

ExceptionHandler handler = new ExceptionHandler(ShowMessage);

handler.WriteLog(ex);

handler.ShowMessage();

}

public static void Publish(Exception ex){

ExceptionHandler handler = new ExceptionHandler();

handler.WriteLog(ex);

}

}

这个上面是一个简单的实现,如果我们需要在处理异常时,完成其它的操作,那么我们可以直接在ExceptionHander类中加入相关的方法即可。

显然,如果客户段需要对捕获的异常进行处理,那么只要实例化一个MessageEventHander的对象,传入相关的方法即可达到目的。

小结

通过上面的例子中,我们实现了一个简单的统一异常处理的类,来达到简化异常处理的目的,用户也可以根据自己的实际需要对该类进行扩展,使对异常的处理更加方便。

分享到:
评论

相关推荐

    Visual C#.NET编程精粹150例.rar

     实例16 异常处理  实例17 链表  实例18 回文数  实例19 汉诺塔  实例20 冒泡排序  实例21 插入排序  小结 第2章 界面编程  实例22 Hello Form  实例23 主菜单  实例24 上下文菜单  实例25 ...

    C#学习路线图:C#经典编程220例 高清版[带完整书签]

    内容包括c#语言及其开发环境、c#语言基础、流程控制语句、字符与字符串、数组和集合、c#面向对象程序设计、异常处理和程序调试、windows窗体、windows应用程序常用控件、windows应用程序高级控件、c#面向对象高级...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    第17章 网络编程技术 357 实例187 通过ip地址获取主机名称 358 实例188 创建web页面浏览器 359 实例189 获取网络信息及流量 361 实例190 远程关闭与重启计算机 363 实例191 设计点对点聊天程序 366 实例192 电子邮件...

    Visual.C#.编程精彩百例

    第1篇 Visual C#基础编程实例 实例1 C#经典程序--Hello World 实例2 C#的简单输入输出(I/O) 实例3 C#的复杂输入输出(I/O) 实例4 通信录管理与维护 实例5 文件与目录管理 实例6 用户界面上的“Hello,World...

    Visual C# 2005编程技巧大全 源码

    全书内容涵盖了大量的Visual C# 2005 编程新技术和新理念,包括ToolStrip控件应用、泛型应用、注册表管理、WMI管理规范使用、XML文件处理、多线程处理、程序异常处理、文件压缩及解压缩、文件加密解密、文件访问权限...

    C#经典实例(第4版) 徐敬德(译) 非扫描版 高清带书签

    具体内容包括:类和泛型,集合、枚举器和迭代器,数据类型,语言集成查询和lambda表达式,调试和异常处理,反射和动态编程,正则表达式,文件系统I/O,网络和Web,XML,安全,线程、同步和并发,工具箱。本书使用...

    C#经典实例中文高清版.zip

    具体内容包括:类和泛型,集合、枚举器和迭代器,数据类型,语言集成查询和lambda表达式,调试和异常处理,反射和动态编程,正则表达式,文件系统I/O,网络和Web,XML,安全,线程、同步和并发,工具箱。本书使用...

    《Visual.C#.编程精彩百例》配套光盘part1

    实例96 C#与C++混合编程的应用 实例97 C#与VB混合编程的应用 实例98 C#组件与C#客户程序编程的应用 实例99 C#与XML联合应用XMLHelper 实例100 在C#中部署应用程序 附录 WinCV 参考文献

    C#基础编程及数据库操作.ppt

    PPT介绍了c#的基础语法,异常处理与跟踪调试,文件操作,关系数据库标准语言SQL,XML Web Service开发,网络安全.FTP协议开发,UDP协议开发,数据库技术等等。

    《Visual.C#.编程精彩百例》配套光盘.part2

    实例64 有趣的列表框窗体 实例65 数学函数应用 &lt;br&gt;第3篇 Visual C#高级编程实例 实例66 文件夹中的文件列表 实例67 读写文本文件 实例68 读写二进制文件 实例69 显示系统日期与时间(1...

    C#CS架构<>

    初学项目,主要流程:借书,还书,事务处理,异常处理,利用反射动态生成页面,可供热爱C# 的新手们参考...谢谢

    C#学习路线图:C#必须知道的300个问题 高清版[带完整书签]

    本书内容包括C#语言及其开发环境、掌握C#语言基础、流程控制语句、字符与字符串、数组和集合、C#面向对象程序设计、异常处理和程序调试、Windows窗体、Windows应用程序常用控件、Windows应用程序高级控件、c撑面向...

Global site tag (gtag.js) - Google Analytics