C# 异常处理

异常是在程序执行期间出现的问题。

C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。

异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。

C# 异常处理时建立在四个关键词之上的:

trycatchfinallythrow

  1. try:一个 try 块标识了一个将被激活的特定的异常的代码块。 后跟一个或多个 catch 块。

  2. catch:程序通过异常处理程序捕获异常。 catch 关键字 表示异常的捕获。

  3. finallyfinally 块用于执行给定的语句,不管异常是否被抛出都会执行。 例如:如果打开一个文件,不管是否出现异常文件都要被关闭。

  4. throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

示例:

try
{
    // 引起异常的语句
}
catch( ExceptionName e1 )
{
    // 错误处理代码
}
...
catch( ExceptionName eN )
{
    // 错误处理代码
}
finally
{
    // 要执行的语句
}

可以列出多个 catch 语句捕获不同类型的异常,以防 try 块在不同的情况下生成多个异常。


C# 中的异常类

  1. C# 异常是使用类来表示的。

  2. C# 中的异常类主要是直接或间接地派生于 System.Exception 类。

  3. System.ApplicationExceptionSystem.SystemException 类是派生于 System.Exception 类的异常类。

  4. System.ApplicationException 类支持由应用程序生成的异常。 所以程序员定义的异常都应派生自该类。

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

派生自 Sytem.SystemException 类的预定义的异常类:

异常类 描述
System.IO.IOException 处理 I/O 错误。
System.IndexOutOfRangeException 处理当方法指向超出范围的数组索引时生成的错误。
System.ArrayTypeMismatchException 处理当数组类型不匹配时生成的错误。
System.NullReferenceException 处理当依从一个空对象时生成的错误。
System.DivideByZeroException 处理当除以零时生成的错误。
System.InvalidCastException 处理在类型转换期间生成的错误。
System.OutOfMemoryException 处理空闲内存不足生成的错误。
System.StackOverflowException 处理栈溢出生成的错误。

创建用户自定义异常

用户自定义的异常类是派生自 ApplicationException 类。

示例:

using System;
namespace UserDefinedException
{
    class TestTemperature
    {
        static void Main(string[] args)
        {
            Temperature temp = new Temperature();
            try
            {
                // 执行存在异常的方法
                temp.showTemp();
            }
            // 捕获 showTemp 中抛出的 TempIsZeroException 类
            catch(TempIsZeroException e)
            {
                Console.WriteLine("TempIsZeroException: {0}", e.Message);
            }
            Console.ReadKey();
        }
    }
}

// 定义异常类
public class TempIsZeroException: ApplicationException
{
    // 构造函数
    public TempIsZeroException(string message): base(message)
    {
    }
}

// 定义操作类
public class Temperature
{
    // 定义存在异常的方法
    public void showTemp()
    {
        // 抛出异常类
        throw (new TempIsZeroException("Zero Temperature found"));
    }
}

抛出对象

如果一个类 是直接或间接派生自 System.Exception 类,可以抛出一个对象。

可以使用 catch 来捕获抛出去的当前对象

注意: catch 中也可继续抛出异常(trow),重叠抛出