C#学习笔记(四) 异常处理及GUI编程

异常概述(Exception)

异常是当程序发生错误时产生的一种信号。在.net中广泛使用。例如:divide-by-zero,arithmetic overflow,array access out of bounds,null object reference,file not found。

每种异常类型都是一个类,分为System.SystemException和System.ApplicationException两大类。

.net中异常处理方式:
异常被对象所表现而不是错误代码,异常的产生是通过throwing一个该异常的对象实现的,异常的捕获是通过catch该异常的对象,异常中命名可以让我们很容易地分辨是哪一类异常。


捕获异常及处理

使用Try-Catch

try
{
    s = <<user's input >>;
    i = int.parse(s);
}
catch
{
    messagebox.show("请输入数字");
    return;
}

如果可能,为每个可能的Exception定制解决方法。将Exception基类放在最后一个Catch子句是一个好办法。
如果不想让程序被错误所终止,要在适当的地方使用try-catch。如果想让异常处理继承,需要在catch子句中写出一些具体的处理方法,空的catch段相当于给异常放行。暗示,在进行完catch子句后程序将继承执行。除非catch子句中有return、throw、System.Environment.Exit()等。

必须正确排列捕获异常的catch子句,范围小的Exception放在前面。可使用finally段来确保收尾工作。

可创建自定义异常,使它适合于特定的应用程序。


跟踪(Trace)


跟踪就是在运行时输出信息。当运行出错时有信息可以参考,是数据记录器。其思路是程序中输出要输出的信息,启动时可选择是否输出跟踪信息。

配置跟踪:常用方法是在.net config中配置。
<configuration>
    <appSettings>
       <add key = "Tracing" value="True"/>
    </appSettings>
</configuration>

static void Main()
  {
   // when app starts, delete the previous log file (if any)
   string  logfile = System.AppDomain.CurrentDomain.BaseDirectory + "AppLog.txt";
   System.IO.TextWriter  log = new System.IO.StreamWriter(logfile);

   if (Globals.Trace)  // then also send trace output to log file?
   {
    System.Diagnostics.TextWriterTraceListener  logger;
    logger = new System.Diagnostics.TextWriterTraceListener(log);
    System.Diagnostics.Trace.Listeners.Add(logger);
    System.Diagnostics.Trace.WriteLine("App starting: " + DateTime.Now);
   }

   Application.Run(new Form1());
  }

 

参考书籍《C#高级程序员指南》

 

 GUI代码是事件驱动代码。在.net中有WinForms 和WebForms 两种GUI应用。

用户的个人行为都被封装在事件中。事件由操作系统来安排顺序执行。
事件被事件处理器处理。一般来说这些处理器方法的代码是写在可视化界面的后面的。.net自动处理事件并生成一些基础的调用事件处理器的代码。
事件通过Delegate(代理)来映射给事件处理器。

事件处理器参数:Sender表示哪个对象生成了事件,EventArgs是例外的特定事件信息。

允许把多个事件映射到同一个处理器。处理器可以在运行时态动态增加或移除映射(动态映射)。

可以“多对一”进行事件处理,也可以“一对多”进行事件处理。

WinForms简介

WinForms= .net 桌面GUI。定义于System.Windows.Forms名域。它完全面向对象并且可以跨语言通用。具有DataGrid等强大的控件,对数据绑定有更好的支持,更好的Resizing支持。采用pixels作为坐标单位。

Visual Studio 在生成的Main代码中自动实例化一个Form的对象。[STAThread]表示单线程运行。这种情况下,该Form成为应用的主Form,当它关闭时,应用程序会退出。为解决这种情况下,一般把Main方法移出FormClass,使之不成为GUI的一部分,它有可能除GUI之外还有其它一些职责,一般再建立一个App类,将Main方法放入其中。

在App中会加一些异常的处理。如:System.Windows.Forms.ThreadException += new System.Threading.ThreadExceptionEventHandler(App.OnAppException);
……

//记录日志并结束程序
private static void OnAppException(object sender,ST.ThreadExceptionEventArgs e)
{
    Exception ex = e.Exception;
    SWF.MessageBox.Show("Halting due to error:" + ex.Message,...);

    T.WriteLine("……");
    while (ex!=null)
    {
        T.WriteLine(ex.GetType().FullName);
        T.Indent();
        T.WrteLine("Msg:" + ex.message);
        T.WriteLine("Trace:" + ex.StackTrace);
        T.Unindent();
        T.Flush();
        ex= ex.InnerException;
    }

    T.Close();
    SWF.Application.Exit();
}


在Main中加入try-catch,将发生的异常传入到上述方法。

 

WinForms编程

是一个很大在领域……如:
1.使用控件
2.建立自定义控件
3.多线程
4.MVC(Model-view-controller)设计模式
……
5.数据绑定

控件可以绑定数据源来获得数据(可绑定整个集合collections,也可以绑定单个对象属性)。在.net中数据绑定是广泛使用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值