位置:首页 > 高级语言 > C#在线教程 > C#异常处理

C#异常处理

异常是程序的执行期间产生的一个问题。 C#例外是一个特殊的情况,在程序运行时,比如尝试除以零而引致的响应。

例外提供一种方法来从一个程序到另一个的部分转移控制。 C#异常处理是建立在四个关键字:try, catch, finally 和 throw.

  • try: try块标识代码块的哪些特定的异常将被激活。它的后面是一个或多个catch块。

  • catch: 程序捕获异常,并在要处理的问题,程序异常处理的地方。美中不足的关键字表示异常的醒目。

  • finally: finally块用来执行一组给定的语句,异常是否被抛出或不抛出。例如,如果打开一个文件时,它必须是封闭的异常是否引发。

  • throw: 一个程序抛出一个异常,当问题出现了。通过使用一个throw关键字。

语法

假设一个块将引发异常,一个捕获异常的方法使用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块中引发不同的情况不止一个例外。

在C#中的异常类

C#异常由类表示。在C#中的异常类主要是直接或间接地来源于System.Exception类。有的从System.Exception类派生的异常类,它们是System.ApplicationException和System.SystemException类。

System.ApplicationException类支持由应用程序生成的异常。因此,由程序员定义的异常应该源于这个类。

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

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

Exception类 描述
System.IO.IOException 处理 I/O 错误
System.IndexOutOfRangeException 处理的方法是指当一个数组索引超出范围的错误产生
System.ArrayTypeMismatchException 处理时,类型不匹配的数组类型产生的错误
System.NullReferenceException 处理从取消引用一个空对象产生的错误
System.DivideByZeroException 处理来自将一个除零而产生的错误
System.InvalidCastException 处理类型转换过程中产生的错误
System.OutOfMemoryException 处理来自可用内存不足产生的错误
System.StackOverflowException 处理从堆栈溢出产生的错误

处理异常

C#提供在try和catch块的形式的结构化的解决异常处理问题。使用这些块的核心程序语句从错误处理的语句分离。

这些错误处理模块使用的是try, catch 和 finally 关键字实现。以下是当通过除以零发生抛出异常的一个例子:

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

创建用户定义的异常

也可以定义自己的异常。用户自定义异常类都源自于ApplicationException类。下面的例子说明了这一点:

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: ApplicationException
{
   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

抛出对象

可以抛出一个对象,如果它是直接或间接地来源于System.Exception类。可以使用throw语句catch块抛出对象如下:

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