结构化异常处理 读书笔记

 

 

主要内容

.NET异常处理机制

主要异常类

结构化异常处理语句及自定义异常处理方法

 

错误、异常与调试的概念

错误:程序错误按照发生机理可分为语法错误、语义错误与逻辑错误

异常:就是程序运行期间发生的错误及其他的意外行为

调试:在应用程序中发现并排除错误的过程被称为调试。调试是帮助程序设计人员查找和排除代码错误的有效手段。

 

异常处理机制

C#语言采用面向对象的方法来处理异常,其异常处理机制可以简单地描述为以下几个步骤:

C#程序在执行过程中一旦出现异常,会自动产生一个异常类对象。该异常对象被提交给C#运行时系统,这个过程被称为抛出异常。此外,在C#中,抛出异常也可以用throw语句强制产生。

C#运行时系统接收到异常对象后,会寻找能处理该异常的方法并把当前异常对象交给其处理,这一过程被称为捕获异常。

当C#运行时系统找不到可以捕获异常的方法时,运行时系统将终止,相应的C#程序也将退出。

异常处理语句语法:

try

{

    //可能产生异常的代码;

}

catch (异常类  异常对象标识符)

{

    //异常处理代码;

}

[其他catch]

finally

{

    //无论是否产生异常总要执行代码

}

实例1

View Code
 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int a = 0, b = 10, c = 0;
6 try
7 {
8 a = b / c;
9 }
10 catch (Exception e)
11 {
12 Console.WriteLine("发生异常:{0}", e.Message);
13 }
14 finally
15 {
16 Console.ReadKey();
17 }
18 }
19 }

当除数为0时抛出异常,语句块catch (Exception e)成功捕获异常。

运行结果:

 

一个try块可应对多个catch块,看实例2:

View Code
 1 class MyClass
2 {
3 static void ProcessString(string str)
4 {
5 if (str==null)
6 {
7 throw new ArgumentNullException();
8 }
9 }
10
11 static void Main(string[] args)
12 {
13 Console.WriteLine("输出结果为:");
14 try
15 {
16 string str = null;
17 ProcessString(str);
18 }
19 catch (ArgumentNullException e)
20 {
21 Console.WriteLine("第一个异常:{0}", e.Message);
22 }
23 catch (Exception e)
24 {
25 Console.WriteLine("第二个异常:{0}", e.Message);
26 }
27 finally
28 {
29 Console.ReadKey();
30 }
31 }
32 }

 

本例通过两个catch语句块进行捕获异常,分别为ArgumentNullException异常和Exception异常。运行结果是:

 主要异常类

Exception类是所有异常类的基类。Exception类有一个经常用到的Message属性,该属性为字符串类型,提供了错误描述的文本。

SystemException:Exception类派生子类,是系统定义的各种异常。

实例3:

View Code
 1 class exception
2 {
3 static void Main(string[] args)
4 {
5 try
6 {
7 Exception myex = new Exception("原始异常");
8 throw myex;
9 }
10 catch (Exception e)
11 {
12 Console.WriteLine("异常类型:{0}", e.GetType().ToString());//GetType方法获取当前实例的运行时类型,ToString方法用于创建并返回当前异常的字符串表示形式
13 Console.WriteLine("异常信息:{0}", e.Message);//Message获取描述当前异常的消息
14 Console.WriteLine("堆栈跟踪:{0}", e.StackTrace);//StackTrace用于获取堆栈上方法调用的信息,有助于跟踪抛出异常的方法
15 Console.WriteLine("应用程序名称:{0}", e.Source);//Source用于获取或设置导致错误的应用程序或对象的名称
16 }
17 finally
18 {
19 Console.ReadKey();
20 }
21 }
22 }

运行结果:

自定义异常类:

ApplicationException :Exception类派生子类,是用户定义的各种异常的基类。

实例4:

View Code
 1 class numException : ApplicationException 
2 {
3 public void printErron()
4 {
5 Console.WriteLine("输入的是数字小于1或者大于9,请重新输入。");
6 }
7 }
8
9 class CustomException
10 {
11 static void Main(string[] args)
12 {
13 string num;
14 do
15 {
16 Console.WriteLine("请输入一个数字,输入“exit”退出程序");
17 num = Console.ReadLine();
18 System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex(@"^[1-9]$");//使用正则表达式判断输入的数为数字
19 try
20 {
21 if (rx.IsMatch(num))
22 {
23 for (int i = 0; i < 10; i++)
24 {
25 Console.WriteLine("{0}*{1}={2}",i,num,i*Convert.ToInt32(num));
26 }
27 }
28 else
29 {
30 throw new numException();
31 }
32 }
33 catch (numException ex)
34 {
35 ex.printErron();
36 Console.WriteLine("异常的类型:{0}",ex.GetType().ToString());
37 }
38 } while (!num.ToLower().Equals("exit"));
39 }
40 }

创建一个自定义异常类numException,该类没有具体实现,但继承了ApplicationException类,从而继承了Exception类,所以它拥有了Exception类中定义的属性和方法。

运行结果:

 

posted @ 2012-01-06 14:52  ·1234567890  阅读(432)  评论(0)    收藏  举报