结构化异常处理(一)

一、错误、bug与异常

在.NET术语命名中,“异常”解释为bug、用户输入错误和运行时错误。

二、.NET异常处理的作用

理想情况下,我们希望将这个错误的名称、消息和其他的有用信息都打进一个明确的包内,这正是结构化异常处理所做的。

结构化异常处理方案的优点:

1.开发人员现在又了统一的而且对.NET领域内各种语言都通用的方式来处理错误。

2.用以引发核捕获异常的语法在不同程序集间或计算机间都是一致的。

3.我们不再是通过接收意义模糊的数字常量来确定问题,而是可以通过异常,它包含容易度读懂的问题描述和首次触发异常时调用栈的详细快照。此外,我们还能够为最终用户提供响应的帮助链接,将他们引向一个URL,其中包含相应错误的详细信息和程序员自定义的数据。

三、.NET异常处理的四要素

结构化异常处理编程要使用4个互相关联的实体:

1.一个表示异常详细信息的类类型;

2.一个向调用者抛出异常类实例的成员;

3.调用者的一段调用异常代码的代码块;

4.调用者的一段(处理)捕获将要发生异常的代码块。

C#编程语言提供4个允许我们引发和处理异常的关键字:try、catch、throw和finally。用来表示问题的类型是一个继承自System.Exception的类。

四、System.Exception基类

System.Exception类型的核心成员

System.Exception属性                                                                                   作用
Data  IDictionary类型只读 此属性返回一个键/值对集合(表示一个实现IDictionary接口的对象),提供有关异常的更多程序员定义信息。该集合默认情况为空。
HelpLink string类型 此属性返回一个URL,指向包含详细错误信息描述的帮助文件或网站
InnerException  Exception类型 只读 此属性为只读的,可用来获取导致当前异常发生的上一个异常的相关信息。上一个异常作为参数被传入当前异常的构造函数而被记录下来。
Message string类型只读,通过构造函数赋值 此属性为只读的,它返回指定错误的文字描述。错误信息本身就是构造函数的一个参数。
Source string类型 只读 次属性返回引发异常的程序集或对象的名称。
StackTrace string类型 只读 此属性为只读的,它包含一个标识触发异常调用序列的字符串。在调试过程中,或者要将错误转储到外部错误的日志中时,这个属性非常有用。
TargetSite MethodBase类型 只读 此属性为只读的,他返回一个MethodBase对象,其中描述了引发异常的方法的许多细节。

五、一个简单的例子

定义一个Car类,如果用户加速一个Car对象超过预先定义的最大速度,Car的引擎就会爆炸,使Car不能再用。

如果用户在车坏了之后还试图加速汽车,就会引发异常。这里将创建并设定一个新的System.Exception类的实例,并通过类的构造函数为只读属性Message赋值。如果将异常对象返回给被调用者,可以使用C#的throw关键字。

1.引发普通的异常

 1 public class Car
 2     {
 3         public Car() { }
 4         public Car(string name, int speed)
 5         {
 6             CurrentSpeed = speed;
 7             PetName = name;
 8         }
 9         //表示最大速度
10         private const int MaxSpeed = 100;
11         //Car是否仍可操纵
12         private bool casIsDead;
13
14         public int CurrentSpeed { get; set; }
15         public string PetName { get; set; }
16
17         public void Accelerate(int delta)
18         {
19             if (casIsDead)
20             {
21                 Console.WriteLine("{0} is out of order...", PetName);
22             }
23             else
24             {
25                 CurrentSpeed += delta;
26                 if (CurrentSpeed >= MaxSpeed)
27                 {
28                     casIsDead = true;
29                     CurrentSpeed = 0;
30
31                     //使用throw关键字引发异常
32                     throw new Exception(string.Format("{0} has overheated!", PetName));
33                 }
34                 else
35                 {
36                     Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);
37                 }
38             }
39         }
40     }

2.捕获异常

 1 static void Main(string[] args)
 2 {
 3         Car myCar = new Car("Zippy", 20);
 4
 5         try
 6         {
 7               for (int i = 0; i < 10; i++)
 8               {
 9                     myCar.Accelerate(10);
10               }
11          }
12          catch (Exception e)
13          {
14                 Console.WriteLine("Method: {0}", e.TargetSite);
15                 Console.WriteLine("Message: {0}", e.Message);
16                 Console.WriteLine("Source: {0}", e.Source);
17          }
18 }

结果:
=> CurrentSpeed = 30
=> CurrentSpeed = 40
=> CurrentSpeed = 50
=> CurrentSpeed = 60
=> CurrentSpeed = 70
=> CurrentSpeed = 80
=> CurrentSpeed = 90
Method: Void Accelerate(Int32)
Message: Zippy has overheated!
Source: ConsoleApplication3

说明:

1.当调用一个可能引发异常的方法时,应该使用try/catch块。一旦捕获到异常对象,将能够调用异常对象成员来释放问题的详细信息。

2.try块时执行过程中可能引发异常的语句的一部分。如果检测到一个异常,程序执行流进如响应的catch块。另一方面,如果try快内包含的代码没有触发异常,响应的catch代码块就直接略过,说明一切正常。

结构化异常处理(一)

时间: 2024-10-09 20:30:17

结构化异常处理(一)的相关文章

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的

结构化异常处理(通过设置CONTEXT结构实现反跟踪)

结构化异常处理是Windows操作系统处理程序错误或异常的技术.在一个应用程序发生错误时,Windows挂起程序,并交由调试器处理,当调试器不能处理时,则调用程序的线程相关的SEH异常处理函数. 异常处理函数可以有一个或多个,采用链表的结构将他们链接起来.当前的处理函数如果不处理,并且有多个处理函数时,可以交由链起来的其它异常处理过程进行处理. 如果程序线程的异常处理函数均选择不处理,如果处于被调试状态,操作系统挂起程序通知调试器. 这时有两种可能: (1)如果程序未处于被调试状态或者调试器仍然

第23章 SEH结构化异常处理(2)

23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTION_REGISTRATION结构 struct VC_EXCEPTION_REGISTRATION { VC_EXCEPTION_REGISTRATION* prev; //前一个结构体的指针 FARPROC handler; //永远指向_exception_handler4回调函数 scopet

关于SEH(结构化异常处理)的一些知识

梳理老罗win32汇编关于SEH一章的知识. 异常处理方式有两种: 筛选器异常处理和结构化异常处理,筛选器是全局性的,无法为一个线程或一个子程序单独设置一个异常处理回调函数,而结构化异常处理(Structured Exception Handing)SEH提供了每个线程之间独立的异常处理方法. 以下以两个例子来学习SEH 例子1:不含栈展开操作的异常处理(栈展开会在例子二中介绍) .386 .model flat,stdcall option casemap:none ;>>>>&

深入研究 Win32 结构化异常处理(好多相关文章)

摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的最基本概念讲起. Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exception handling,SEH)了.一提到结构化异常处理,可能就会令人想起

结构化异常处理(五)处理多个异常

一.多个catch块 在最简单的情形下,一个try块有一个catch块.但是在现实中,你常常会遇到包含try块的语句能够触发许多可能发生的异常的情形. 1.接之前的例子修改,假定在用户传入一个无效参数(比如小于0的值)的情况下,修改Car的Accelerate()方法还会引发一个基础类库定义的异常ArgumentOutOfRangeException. 该异常类的构造函数接收的第一个字符串参数为错误参数的名称,然后是描述该错误的信息. 代码: 1 public void Accelerate(i

解析结构化异常处理(SEH)(第二部分)

书接上一篇:http://www.cnblogs.com/ONDragon/p/6855174.html 虽然这个异常回调机制很好,但它并不是一个完美的解决方案.对于稍微复杂一些的应用程序来说,仅用一个 函数就能处理程序中任何地方都可能发生的异常是相当困难的.一个更实用的方案应该是有多个异常处理例程,每个例程针对程序中的一部分.实际上,操作系统提 供的正是这个功能. 还 记得系统用来查找异常回调函数的EXCEPTION_REGISTRATION结构吗?这个结构的第一个成员,称为prev,前面我们

结构化异常处理系列

最近在项目中看到了许多自定义异常类,就想把它搞明白. 想知道为什么要这样处理?这样处理的优点是什么?自己怎么常见自己需要的自定义异常类? C#结构化异常处理是将程序中出现的错误的名称.消息和其他有用的信息都打进一个定义明确的包内. 构建一个强类型的自定义异常,这样在程序中对异常处理时就可以根据不同问题具有针对性的使用异常类,这样使用起来也更加明了,一看到就知道这里处理的是什么异常,一目了然. 下面就将学习笔记放在这里,希望大家多多指点: 结构化异常处理(一)概述 结构化异常处理(二)配置异常的状

深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)

摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的最基本概念讲起. Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exception handling,SEH)了.一提到结构化异常处理,可能就会令人想起