使用異常


在 C# 中,程序中的运行时错误使用一种称为“异常”的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕捉。异常可由 .NET Framework 公共语言运行库 (CLR) 或由程序中的代码引发。一旦引发了一个异常,这个异常就会在调用堆栈中往上传播,直到找到针对它的 catch 语句。未捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框。

异常由从 Exception 派生的类表示。此类标识异常的类型,包含详细描述异常的属性。引发异常涉及到创建一个异常派生类的实例,配置异常的属性(可选),然后使用 throw 关键字引发该对象。例如:

private static void TestThrow() {     System.ApplicationException ex =          new System.ApplicationException("Demonstration exception in TestThrow()");      throw ex; } 在引发异常之后,运行库检查当前语句以确定它是否在 try 块中。如果是,则检查与该 try 块关联的任何 catch 块,以确定它们是否能够捕获该异常。Catch 块通常会指定异常类型;如果该 catch 块的类型与异常或其基类的类型相同,则该 catch 块就能够处理该方法。例如:  static void TestCatch() {     try     {         TestThrow();     }     catch (System.ApplicationException ex)     {         System.Console.WriteLine(ex.ToString());     } }

如果引发异常的语句不在 try 块中,或者包含该语句的 try 块没有匹配的 catch 块,运行库将检查调用方法中是否有 try 语句和 catch 块。运行库将在调用堆栈中向上继续搜索兼容的 catch 块。在找到并执行 catch 块之后,控制权将传递给 catch 块之后的第一个语句。

一个 try 语句可能包含多个 catch 块。将执行第一个能够处理该异常的 catch 语句;任何后续的 catch 语句都将被忽略,即使它们是兼容的也如此。例如:

static void TestCatch2() {     try     {         TestThrow();     }     catch (System.ApplicationException ex)     {         System.Console.WriteLine(ex.ToString());  // this block will be executed     }     catch (System.Exception ex)     {         System.Console.WriteLine(ex.ToString());  // this block will NOT be executed     }      System.Console.WriteLine("Done");  // this statement is executed after the catch block }

在执行 catch 块之前,将检查由运行库评估过的 try 块(包括包含兼容的 catch 块的 try 块)中是否有 finally 块。Finally 块允许程序员清理中止的 try 块可能留下的任何不明确状态,或释放任何外部资源(如图形句柄、数据库连接或文件流),而不用等待运行库中的垃圾回收器来完成这些对象。例如: static void TestFinally()

{     System.IO.FileStream file = null;     System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:""file.txt");      try     {         file = fileInfo.OpenWrite();         file.WriteByte(0xF);     }     finally     {         // Closing the file allows you to reopen it immediately - otherwise IOException is thrown.         if (file != null)         {             file.Close();         }     }      try     {         file = fileInfo.OpenWrite();         System.Console.WriteLine("OpenWrite() succeeded");     }     catch (System.IO.IOException)     {         System.Console.WriteLine("OpenWrite() failed");     }  }

如果 WriteByte() 引发了异常,那么在没有调用 file.Close() 的情况下,第二个 try 块中尝试重新打开文件的代码就会失败,并且文件将保持锁定状态。由于无论是否引发异常都要执行 finally 块,前一示例中的 finally 块允许正确地关闭文件并可帮助避免错误。

posted on 2009-02-27 21:14  wanghuaide  阅读(169)  评论(0)    收藏  举报

导航