.net Framework拾遗(5) 异常

来源:互联网 发布:删除数组中指定位置 编辑:程序博客网 时间:2024/04/30 06:22

.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 派生的基异常,它在执行各指令时引发这些异常。
  

异常类型基类型说明示例
ExceptionObject所有异常的基类。无(使用此异常的派生类)。
SystemExceptionException所有运行时生成的错误的基类。无(使用此异常的派生类)。
IndexOutOfRangeExceptionSystemException仅当错误地对数组进行索引时,才由运行库引发。在数组的有效范围外对数组进行索引:

arr[arr.Length+1]

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

o.ToString();

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

"Calculate".IndexOf (s);

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

s.Chars[9];

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


   

原创粉丝点击