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

    技术2022-05-11  51

    异常概述(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)