.net Framework拾遗(5) 异常

原创 2004年10月28日 17:47:00

.net Framework拾遗(5) 异常

1.概述
  程序必须能够统一处理在执行期间发生的错误

  传统上,语言的错误处理模型依赖于语言检测错误和查找错误处理程序的独特方法
      或依赖于操作系统提供的错误处理机制.

  运行库实现的异常处理具有以下特点:
      处理异常时不考虑生成异常的语言或处理异常的语言
      异常处理时不要求任何特定的语言语法,而是允许每种语言定义自己的语法
      允许跨进程甚至跨计算机边界引发异常

  异常是从exception类继承的对象
  异常从发生问题的代码区域引发,
  然后沿堆栈向上传递,真到应用程序处理它或程序终止
 
  运行库为每个可执行文件创建一个异常信息表
  可执行文件的每个方法都有一个关联的异常处理信息数组
  数组中的每一项描述一个受保护的代码块,任何与该代码关联的异常筛选器和任何异常处理(Catch语句)

2.Exception类
 
  表示在应用程序执行期间发生的错误。
 
  签名如下:
  System.Object
     System.Exception
        派生类
        <Serializable>
        <ClassInterface(ClassInterfaceType.AutoDual)>
        Public Class Exception
          Implements ISerializable


   如果应用程序将处理在执行应用程序代码块期间发生的异常,则代码必须放置在 try 语句中。
   每个 catch 块均包含一个确定该块处理的异常类型的类型筛选器。

   在 try 块中出现异常时,
   系统按所关联 catch 块在应用程序代码中出现的顺序搜索它们,
   直到定位到处理该异常的 catch 块为止。
   如果某 Catch 块的类型筛选器指定 T 或任何派生出 T 的类型,则该 catch 块处理 T 类型的异常。
   系统在找到第一个处理该异常的 catch 块后即停止搜索。
   在应用程序代码中处理某类型的 catch 块必须在处理其基类型的 catch 块之前指定。
   处理 System.Exception 的 Catch 块最后指定。

   如果当前 try 块所关联的所有 catch 块均不处理该异常,
   且当前 try 块嵌套在当前调用的其他 try 块中,
   则搜索与下一个封闭 try 块相关联的 catch 块。
   如果没有找到用于该异常的 catch 块,则系统搜索当前调用中前面的嵌套级别。
   如果在当前调用中没有找到用于该异常的 catch 块,
   则将该异常沿调用堆栈向上传递,搜索上一个堆栈帧来查找处理该异常的 catch 块。
   继续搜索调用堆栈,直到该异常得到处理或调用堆栈中没有更多的帧为止。
   如果到达调用堆栈顶部却没有找到处理该异常的 catch 块,则由默认的异常处理程序处理该异常,然后应用程序终止。

   基类 Exception 下存在两类异常:
     从 SystemException 派生的预定义公共语言运行库异常类。
     从 ApplicationException 派生的用户定义的应用程序异常类。

   Exception类的属性
     StackTrace 属性:
       Public Overridable ReadOnly Property StackTrace As String
       可用来确定错误发生位置的堆栈跟踪。
       如果有可用的调试信息,则堆栈跟踪包含源文件名和程序行号。

     InnerException 属性:
       Public ReadOnly Property InnerException As Exception
       用来在异常处理过程中创建和保留一系列异常。
       可使用此属性创建一个新异常来包含以前捕捉的异常。
       原始异常可由InnerException 属性中的第二个异常捕获,
       这使处理第二个异常的代码可以检查附加信息。
       例如,假设有一个读取文件并格式化相应数据的方法。
       代码试图从文件读取,但引发 FileException。
       该方法捕捉 FileException 并引发 BadFormatException。
       在此情况下,FileException 可保存在 BadFormatException 的 InnerException 属性中。

    Message 属性:
       Public Overridable ReadOnly Property Message As String
       提供有关异常起因的详细信息。
       Message 用引发异常的线程的 Thread.CurrentUICulture 属性所指定的语言表示。

    HelpLink 属性:
       Public Overridable Property HelpLink As String
       此属性可保存某个帮助文件的 URL(或 URN),该文件提供有关异常起因的大量信息。

    大多数从 Exception 继承的类都不实现其他成员或提供附加功能;
    它们只是从 Exception 继承。
    因此,在异常层次结构、异常名称以及异常包含的信息中可以找到有关异常的最重要信息。

EXP

'*********************************************************************************************************
Imports System
Class ExceptionTestClass
   Public Shared Sub Main()
      Dim x As Integer = 0
      Try
         Dim y As Integer = 100 / x
      Catch e As ArithmeticException
         Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())
      Catch e As Exception
         Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
      End Try
   End Sub 'Main
End Class 'ExceptionTestClass
'*********************************************************************************************************

3.异常层次结构
 
  有两种类型的异常:
     执行程序生成的异常
     公共语言运行库生成的异常。
  另外,还有由应用程序或运行库引发的异常的层次结构。

  Exception 是异常的基类。
  若干异常类直接从 Exception 继承,
  其中包括 ApplicationException 和 SystemException。这两个类构成几乎所有运行库异常的基础。

  大多数直接从 Exception 派生的异常不为 Exception 类添加任何功能。
  例如,InvalidCastException 类层次结构如下所示:
           Object
             Exception
               SystemException
                  InvalidCastException

  错误发生时,运行库引发 SystemException 的适当派生类。
  这些错误是失败的运行库检查(如数组超出界限错误)导致的,
  它们可在任何方法的执行过程中发生。
  ApplicationException 由用户程序引发,而不是由运行库引发。
  如果设计创建新异常的应用程序,应从 ApplicationException 类派生那些异常。

  不建议捕捉 SystemException,在应用程序中引发 SystemException 也不是好的编程做法。

  最严重的异常,即那些由运行库引发或在不可恢复的情况中引发的异常,
  包括 ExecutionEngineException、StackOverflowException  和 OutOfMemoryException。

  交互操作异常从 SystemException 派生并由 ExternalException 进一步扩展。
  例如,COMException 是 COM Interop 操作过程中引发的异常,它从 ExternalException 派生。
  Win32Exception 和 SEHException 也从 ExternalException 派生。

  运行库异常层次结构
 
  运行库有一组从 SystemException 派生的基异常,它在执行各指令时引发这些异常。
  

异常类型 基类型 说明 示例
Exception Object 所有异常的基类。 无(使用此异常的派生类)。
<?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" />SystemException Exception 所有运行时生成的错误的基类。 无(使用此异常的派生类)。
IndexOutOfRangeException SystemException 仅当错误地对数组进行索引时,才由运行库引发。 在数组的有效范围外对数组进行索引:

arr[arr.Length+1]

NullReferenceException SystemException 仅当引用空对象时,才由运行库引发。 object o = null;

o.ToString();

InvalidOperationException SystemException 当处于无效状态时,由方法引发。 从基础集合移除 Item 后调用 Enumerator.GetNext()
ArgumentException SystemException 所有参数异常的基类。 无(使用此异常的派生类)。
ArgumentNullException ArgumentException 由不允许参数为空的方法引发。 String s = null;

"Calculate".IndexOf (s);

ArgumentOutOfRangeException ArgumentException 由验证参数是否位于给定范围内的方法引发。 String s = "string";

s.Chars[9];

ExternalException SystemException 在运行库的外部环境中发生或针对这类环境的异常的基类。 无(使用此异常的派生类)。
COMException ExternalException 封装 COM HRESULT 信息的异常。 在 COM Interop 中使用。
SEHException ExternalException 封装 Win32 结构化异常处理信息的异常。 在非托管代码 interop 中使用。


   

.net Framework拾遗(1)元数据

.net Framework拾遗(1)元数据目录1.概述2.元数据优点3.元数据和PE文件结构 1.概述 在过去,以一种语言编写的软件组件(.exe或.dll)不能方便地使用以另一种语言编写的软件组件...
  • colayungnew
  • colayungnew
  • 2004年10月28日 16:08
  • 1039

net Framework拾遗(1)元数据

 1.概述 在过去,以一种语言编写的软件组件(.exe或.dll)不能方便地使用以另一种语言编写的软件组件。 在这个问题的解决上,COM向前迈进了一步。 .net Framework允许编译器向所有的...
  • vipxiaotian
  • vipxiaotian
  • 2007年07月17日 21:46
  • 512

Windows10系统.NET Framework 3.5离线安装方法

Win10技术预览版给用户们带来很多新功能的同时,也给用户们带来了不害臊的麻烦与问题。其中.NET Framework 4.5是系统预装的,但是在Win10技术预览版中的部分应用需要.NET Fram...
  • scorpio3k
  • scorpio3k
  • 2015年05月03日 21:41
  • 5831

VS2015崩溃问题;devenv.exe[5736]中发生未处理的Microsoft .NET Framework异常

今天打开vs2015,一打开就崩溃,然后调试就是这样的 如图 比较崩溃有没有?明明昨晚还是好的,怎么突然出现这个问题呢?然后百度一下,有的童鞋就是说是固有的bug,重装VS(当然VS是全家桶,不好删除...
  • sinat_20280061
  • sinat_20280061
  • 2016年05月10日 14:03
  • 4519

捕获Entity framework验证异常

Entity framework在验证未通过的时候默认不会抛出详细异常,这给我们debug带来很大的困难,不过我们可以手动捕获,见代码: private int Update(Employee en...
  • mx5721
  • mx5721
  • 2014年05月07日 15:45
  • 3031

.Net Framework各个版本区别

什么是.NET Framework?   .NET Framework又称 .Net框架。是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(...
  • tiana0
  • tiana0
  • 2013年09月15日 09:35
  • 4441

win10 安装 .Net Framework 3.5 采用 netframework3.5.cab文件安装

从微软官网下载netframework.exe不能安装,故采用下面方法。 1 根据win 10 是32位的还是64位的分别下载相应的netframework.cab文件,并把该文件放进本地一个文件夹...
  • chen1540524015
  • chen1540524015
  • 2017年07月15日 15:39
  • 1112

数学拾遗

布尔运算 与非(NAND)或非(NOR)不同于异或或者异或 与非门真值表: A B Y 0 0 1 0 1 1 1 0 1 1 1 0 逻辑表...
  • lanchunhui
  • lanchunhui
  • 2015年11月23日 23:11
  • 596

.NET Framework详解之内存机制

.NET Framework详解之内存机制:在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CL...
  • xiaoran1985
  • xiaoran1985
  • 2014年03月11日 11:22
  • 641

.Net Framework学习的10个建议

1、多练习,课本上的内容一定要通读,里面的示例程序要亲自测试,或许你会发现书上平时看不出来的小错误,另外,输入时候的手误也是难免的,那么在解决问题的过程中也会让你加深对某个知识点的理解,举例如下:pu...
  • abigfrog
  • abigfrog
  • 2009年10月23日 14:40
  • 5262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net Framework拾遗(5) 异常
举报原因:
原因补充:

(最多只允许输入30个字)