黑马程序员技术交流社区

标题: try异常处理1 [打印本页]

作者: 逝者轨迹    时间: 2013-5-11 11:07
标题: try异常处理1
1.   异常概述
在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。
在可能引发异常的语句周围使用 try 块。
try 块中发生异常后,控制流会立即跳转到关联的异常处理程序(如果存在)。
如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误消息。
如果 catch 块定义了一个异常变量,则可以使用它来获取有关所发生异常的类型的更多信息。
可能导致异常的操作通过 try 关键字来执行。
异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。
程序可以使用 throw 关键字显式地引发异常。
异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。
即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。

2.   异常处理基础知识
2.1.  如何:使用 Try/Catch 块捕捉异常
将可能引发异常的代码节放在 Try 块中,而将处理异常的代码放在 Catch 块中。Catch 块是一系列以关键字 catch 开头的语句,语句后跟异常类型和要执行的操作。
下面的代码示例使用 Try/Catch 块捕捉可能的异常。Main 方法包含带有 StreamReader 语句的 Try 块,该语句打开名为 data.txt 的数据文件并从该文件写入字符串。Try 块后面是 Catch 块,该块捕捉 Try 块产生的任何异常。

using System;
using System.IO;
using System.Security.Permissions;
// Security permission request.
[assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, All = @"c:\data.txt")]
public class ProcessFile {
    public static void Main() {
        try {
            StreamReader sr = File.OpenText("data.txt");
            Console.WriteLine("The first line of this file is {0}", sr.ReadLine());   
        }
        catch(Exception e) {
            Console.WriteLine("An error occurred: '{0}'", e);
        }
    }
}

2.2.  如何:在 Catch 块中使用特定异常
发生异常时,异常沿堆栈向上传递,每个 Catch 块都有机会处理它。Catch 语句的顺序很重要。将针对特定异常的 Catch 块放在常规异常 Catch 块的前面,否则编译器可能会发出错误。确定正确 Catch 块的方法是将异常的类型与 Catch 块中指定的异常名称进行匹配。如果没有特定的 Catch 块,则由可能存在的常规 Catch 块捕捉异常。

下面的代码示例使用 try/catch 块捕获 InvalidCastException。该示例创建一个名为 Employee 的类,它带有一个属性:职员级别 (Emlevel)。PromoteEmployee 方法取得对象并增加职员级别。将 DateTime 实例传递给 PromoteEmployee 方法时,发生 InvalidCastException。

using System;
public class Employee
{
   //Create employee level property.
   public int Emlevel
   {
      get
         {
         return(emlevel);
         }
      set
         {
         emlevel = value;
         }
   }
   int emlevel;
}
public class Ex13
{
   public static void PromoteEmployee(Object emp)
   {
   //Cast object to Employee.
   Employee e = (Employee) emp;
   // Increment employee level.
   e.Emlevel = e.Emlevel + 1;
   }

   public static void Main()
   {
   try
      {
   Object o = new Employee();
   DateTime newyears = new DateTime(2001, 1, 1);
   //Promote the new employee.
   PromoteEmployee(o);
   //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
   PromoteEmployee(newyears);
      }
   catch (InvalidCastException e)
      {
      Console.WriteLine("Error passing data to PromoteEmployee method. " + e);
      }
   }
}
2.3.  如何:显式引发异常
可以使用 throw 语句显式引发异常。还可以使用 throw 语句再次引发捕获的异常。较好的编码做法是,向再次引发的异常添加信息以在调试时提供更多信息。

下面的代码示例使用 try/catch 块捕获可能的 FileNotFoundException。try 块后面是 catch 块,catch 块捕获 FileNotFoundException,如果找不到数据文件,则向控制台写入消息。下一条语句是 throw 语句,该语句引发新的 FileNotFoundException 并向该异常添加文本信息。

using System;
using System.IO;

public class ProcessFile
{
   public static void Main()
      {
      FileStream fs = null;
      try  
      {
         //Opens a text tile.
         fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);
         StreamReader sr = new StreamReader(fs);
         string line;

         //A value is read from the file and output to the console.
         line = sr.ReadLine();
         Console.WriteLine(line);
      }
      catch(FileNotFoundException e)
      {
         Console.WriteLine("[Data File Missing] {0}", e);
         throw new FileNotFoundException(@"data.txt not in c:\temp directory]",e);
      }
      finally
      {
         if (fs != null)
            fs.Close();
      }
   }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2