Csharp 简明教程

C

异常是在执行程序期间出现的问题。C# 异常是对程序运行期间出现的特殊情况(如尝试除以零)的响应。

异常提供了一种将程序某一部分的控制权转移到程序另一部分的方法。C# 异常处理建立在四个关键字的基础上: trycatchfinallythrow

  1. try − try 块可识别已激活特定异常的代码块。它后面跟着一个或多个异常处理块。

  2. catch − 程序在一个希望处理问题的程序位置的异常处理程序中捕获异常。catch 关键字表示捕获某个异常。

  3. finally − 无论是否抛出异常,finally 块都用于执行给定的语句组。例如,如果你打开了一个文件,那么无论是否引发异常,都必须关闭它。

  4. throw − 当出现问题时,程序抛出异常。这是使用 throw 关键字完成的。

Syntax

假设一个块引发了异常,那么该方法使用 try 和 catch 关键字的组合捕获了一个异常。try/catch 块周围放有可能会生成异常的代码。try/catch 块中的代码称为受保护代码,而使用 try/catch 的语法如下所示 −

try {
   // statements causing exception
} catch( ExceptionName e1 ) {
   // error handling code
} catch( ExceptionName e2 ) {
   // error handling code
} catch( ExceptionName eN ) {
   // error handling code
} finally {
   // statements to be executed
}

你可以列出多个 catch 语句,以便在你 try 块在不同情况下引发多个异常时捕获不同类型的异常。

Exception Classes in C

C# 异常由类表示。C# 中的异常类主要是直接或间接地派生自 System.Exception 类。派生自 System.Exception 类的某些异常类是 System.ApplicationException 和 * System.SystemException * 类。

System.ApplicationException 类支持应用程序生成的异常。因此,程序员定义的异常应派生自此类。

System.SystemException 类是所有预定义的系统异常的基类。

下表提供了从 Sytem.SystemException 类派生的某些预定义异常类 −

Sr.No.

Exception Class & Description

1

System.IO.IOException Handles I/O errors.

2

System.IndexOutOfRangeException 处理当某个方法指代超出范围的数组索引时生成错误。

3

System.ArrayTypeMismatchException 处理当类型与数组类型不匹配时生成错误。

4

System.NullReferenceException 处理因引用空对象而生成错误。

5

System.DivideByZeroException 处理因将除数除以零而生成错误。

6

System.InvalidCastException 处理类型转换期间生成的错误。

7

System.OutOfMemoryException 处理因可用内存不足而生成的错误。

8

System.StackOverflowException 处理因堆栈溢出而生成的错误。

Handling Exceptions

C# 以尝试和捕获块的形式提供了一种结构化的异常处理解决方案。使用这些块可以将程序核心语句与错误处理语句分开。

这些错误处理块使用 trycatchfinally 关键字实现。以下是除以零条件发生时引发异常的一个示例 −

using System;

namespace ErrorHandlingApplication {
   class DivNumbers {
      int result;

      DivNumbers() {
         result = 0;
      }
      public void division(int num1, int num2) {
         try {
            result = num1 / num2;
         } catch (DivideByZeroException e) {
            Console.WriteLine("Exception caught: {0}", e);
         } finally {
            Console.WriteLine("Result: {0}", result);
         }
      }
      static void Main(string[] args) {
         DivNumbers d = new DivNumbers();
         d.division(25, 0);
         Console.ReadKey();
      }
   }
}

编译并执行上述代码后,将产生以下结果 −

Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0

Creating User-Defined Exceptions

您还可以定义自己的异常。用户定义的异常类派生自 Exception 类。以下示例对此进行了演示 −

using System;

namespace UserDefinedException {
   class TestTemperature {
      static void Main(string[] args) {
         Temperature temp = new Temperature();
         try {
            temp.showTemp();
         } catch(TempIsZeroException e) {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: Exception {
   public TempIsZeroException(string message): base(message) {
   }
}
public class Temperature {
   int temperature = 0;

   public void showTemp() {

      if(temperature == 0) {
         throw (new TempIsZeroException("Zero Temperature found"));
      } else {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

编译并执行上述代码后,将产生以下结果 −

TempIsZeroException: Zero Temperature found

Throwing Objects

如果某个对象是直接或间接派生自 System.Exception 类的,则可以引发该对象。您可以在 catch 块中使用 throw 语句将当前对象作为 −

Catch(Exception e) {
   ...
   Throw e
}