结构化异常处理(二):配置异常的状态

一、TargetSite属性(public MethodBase TargetSite { get; })

System.Exception.TargetSite属性帮助我们了解引发某个异常的方法的各种信息。输出TargetSite的值将显示返回值类型、方法名称、引发异常方法的参数。

它不是只返回字符串,而是返回一个强类型的System.Reflection.MethodBase对象。

1  Console.WriteLine("Member name: {0}", e.TargetSite);//输出结果:Void Accelerate(Int32)
2  Console.WriteLine("Class defining member: {0}", e.TargetSite.DeclaringType);//输出结果:ConsoleApplication3.Car
3  Console.WriteLine("Member Type: {0}", e.TargetSite.MemberType);//输出结果:Method

说明:

1.我们使用MethodBase.DeclaringType属性值来制定引发异常的类的全称(这个例子中时ConsoleApplication3.Car)。

2.使用MethodBase对象的MemberType属性来确定引发异常的成员类型(比如属性和方法)。

二、StackTrace属性(public virtual string StackTrace { get; })

System.Exception.StackTrace属性帮助我们标识引发异常的一些列调用。需要注意的是,StackTrace的值是异常创建时自动产生的,无法为其赋值。

例:

1 catch(Exception e)
2 {
3     Console.WriteLine("Stack: {0}", e.StackTrace);
4 }

输出:
Stack: 在 ConsoleApplication3.Car.Accelerate(Int32 delta) 位置 e:\Test\ConsoleApplication3\ConsoleApplication3\Program.cs:行号 66标识这个序列的首次调用
          在 ConsoleApplication3.Program.Main(String[] args) 位置 e:\Test\ConsoleApplication3\ConsoleApplication3\Program.cs:行号 18标识出错成员的具体位置

在调试装或记录制定应用程序时,这些信息都非常有用,它使我们能顺其自然地发现错误的根源。

三、HelpLink属性(public virtual string HelpLink{ get; set; })

默认情况下HelpLink属性的值是一个空字符串。如果读者需要一个有意义的值填充该属性,就要在引发System.Exception类型异常之前赋值。

例:

将上例中的Accelerate方法更新

 1 public void Accelerate(int delta)
 2         {
 3             if (casIsDead)
 4             {
 5                 Console.WriteLine("{0} is out of order...", PetName);
 6             }
 7             else
 8             {
 9                 CurrentSpeed += delta;
10                 if (CurrentSpeed >= MaxSpeed)
11                 {
12                     casIsDead = true;
13                     CurrentSpeed = 0;
14
15                     //我们需要调用HelpLink属性,因此需要在异常对象引发之前先创建一个本地变量
16                     Exception ex = new Exception(string.Format("{0} has overheated!", PetName));
17                     ex.HelpLink = "http://www.CarsRus.com";
18                     throw ex;
19                 }
20                 else
21                 {
22                     Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);
23                 }
24             }
25         }

四、Data属性(public virtual IDictionary Data { get; })
System.Exception中的Data属性允许我们使用用户提供的响应信息来填充异常对象。

更新Accelerate方法:

 1 public void Accelerate(int delta)
 2         {
 3             if (casIsDead)
 4             {
 5                 Console.WriteLine("{0} is out of order...", PetName);
 6             }
 7             else
 8             {
 9                 CurrentSpeed += delta;
10                 if (CurrentSpeed >= MaxSpeed)
11                 {
12                     casIsDead = true;
13                     CurrentSpeed = 0;
14
15                     //我们需要调用HelpLink属性,因此需要在异常对象引发之前先创建一个本地变量
16                     Exception ex = new Exception(string.Format("{0} has overheated!", PetName));
17                     ex.HelpLink = "http://www.CarsRus.com";
18
19                     //填充关于错误的自定义数据
20                     ex.Data.Add("TimeStamp", string.Format("The car exploded at {0}", DateTime.Now));
21                     ex.Data.Add("Cause", "You have a lead foot.");
22                     throw ex;
23                 }
24                 else
25                 {
26                     Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);
27                 }
28             }

调用:

 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                 //默认情况下,data字段是空的,需要检查是否为空
15                 if (e.Data != null)
16                 {
17                     foreach (DictionaryEntry item in e.Data)
18                     {
19                         Console.WriteLine("-> {0}: {1}", item.Key, item.Value);
20                     }
21                 }
22             }
23         }

输出:

=> CurrentSpeed = 30
=> CurrentSpeed = 40
=> CurrentSpeed = 50
=> CurrentSpeed = 60
=> CurrentSpeed = 70
=> CurrentSpeed = 80
=> CurrentSpeed = 90
-> TimeStamp: The car exploded at 2014-06-26 16:16:54
-> Cause: You have a lead foot.

说明:

Data属性非常有用,因为它允许我们打包关于“错误”的自定义信息,无须构建全新的类类型来扩展Exception基类。

结构化异常处理(二):配置异常的状态

时间: 2024-07-29 00:20:05

结构化异常处理(二):配置异常的状态的相关文章

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

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

结构化异常处理(三)系统级异常和应用程序级异常

一.系统级异常 1.准去的说,.NET平台引发的一场应被称为系统异常.这些异常被认为是无法修复的致命错误. 2.系统异常直接派生自名为System.SystemException的基类,该基类派生自System.Exception. SystemException除了一组自定义的构造函数不添加任何功能. public class SystemException :  Exception { //各种构造函数 } 3.当一个异常类型派生自System.SystemException时,我们就能够判

结构化异常处理系列

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

结构化异常处理(四)构建自定义异常

一.构建一个强类型异常来表示当前问题的独特细节效果会更好. 假定要构建一个名为CarIsDeadException的自定义异常来表示加速注定要损坏的汽车的错误. 1.创建一个派生自System.Exception/System.ApplicationException的新类(按照约定,所有的一场类均应以“Exception”后缀结束,这是.NET的最佳实践). 1 namespace CustomException 2 { 3 public class CarIsDeadException :

[转载]深入解析结构化异常处理

尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗. 1997年文章,Windows技术的根一直没变:http://www.microsoft.com/msj/0197/exception/exception.aspx Matt Pietrek 著 董岩 译 在Win32操作系统提供的所有功能中,使用最广泛而又没有公开的恐怕要数结构化异常处理(Structured Exception Ha

Windows结构化异常处理浅析

近期一直被一个问题所困扰,就是写出来的程序老是出现无故崩溃,有的地方自己知道可能有问题,但是有的地方又根本没办法知道有什么问题.更苦逼的事情是,我们的程序是需要7x24服务客户,虽然不需要实时精准零差错,但是总不能出现断线丢失数据状态.故刚好通过处理该问题,找到了一些解决方案,怎么捕获访问非法内存地址或者0除以一个数.从而就遇到了这个结构化异常处理,今就简单做个介绍认识下,方便大家遇到相关问题后,首先知道问题原因,再就是如何解决.废话不多说,下面进入正题. 什么是结构化异常处理 结构化异常处理(

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

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

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

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

结构化异常处理(一)

一.错误.bug与异常 在.NET术语命名中,“异常”解释为bug.用户输入错误和运行时错误. 二..NET异常处理的作用 理想情况下,我们希望将这个错误的名称.消息和其他的有用信息都打进一个明确的包内,这正是结构化异常处理所做的. 结构化异常处理方案的优点: 1.开发人员现在又了统一的而且对.NET领域内各种语言都通用的方式来处理错误. 2.用以引发核捕获异常的语法在不同程序集间或计算机间都是一致的. 3.我们不再是通过接收意义模糊的数字常量来确定问题,而是可以通过异常,它包含容易度读懂的问题