异常概述(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中数据绑定是广泛使用的。