C#异常处理

C# 异常处理

异常处理

异常是程序执行过程中产生的问题。C# 异常是对程序运行过程中出现的额外情况的一种反馈,例如除数为零时。
异常提供了一种将控制权从程序的一个部分转移到另一个部分的方式。C# 异常处理有四个关键词:trycatchfinallythrow

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

catch:一个用于捕获异常的程序段,将 catch 放在你希望能处理这个异常的地方。“catch”这个关键字标志着异常的捕获。

finally:finally 保证了无论是否有异常抛出,此代码段中的程序都会被执行。例如,如果你打开了一个文件,那么不管是否发生了异常,文件都需要关闭。

throw:当出现问题时,程序会抛出异常。这项工作是通过使用 throw 来实现的。

语法

假设一个代码块产生了一个异常,通过使用 trycatch 的组合可以捕获这个异常。一个 try/catch 代码块需要放置在可能会产生异常的代码段周围。try/catch 代码段就像是保护代码,它的使用语法如下:


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

当你的 try 语句块可能会抛出多种异常时,你可以列出多种的 catch 语句,以便捕获不同种类的异常。

C#中的异常类

C# 异常由类表示。在 C# 中的异常类主要是直接或间接地来源于 System.Exception 类。
System.ApplicationExceptionSystem.SystemException 类是派生于 System.Exception 类的异常类。
System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类
System.SystemException 类是所有预定义的系统异常的基类
下表提供了一些从 Sytem.SystemException 类派生的预定义的异常类:

异常类描述
System.IO.IOException处理 I/O 错误。
System.IndexOutOfRangeException处理当方法指向超出范围的数组索引时生成的错误。
System.ArrayTypeMismatchException处理当数组类型不匹配时生成的错误。
System.NullReferenceException处理当依从一个空对象时生成的错误。
System.DivideByZeroException处理当除以零时生成的错误。
System.InvalidCastException处理在类型转换期间生成的错误。
System.OutOfMemoryException处理空闲内存不足生成的错误。
System.StackOverflowException处理栈溢出生成的错误。
SystemException其他用户可处理的异常的基本类
ArgumentException方法的参数是非法的
ArgumentNullException一个空参数传递给方法,该方法不能接受该参数
ArgumentOutOfRangeException参数值超出范围
ArithmeticException出现算术上溢或者下溢
ArrayTypeMismatchException试图在数组中存储错误类型的对象
BadImageFormatException图形的格式错误
DivideByZeroException除零异常
DllNotFoundException找不到引用的DLL
FormatException参数格式错误
IndexOutOfRangeException数组索引超出范围
InvalidCastException使用无效的类
InvalidOperationException方法的调用时间错误
MethodAccessException试图访问思友或者受保护的方法
MissingMemberException访问一个无效版本的DLL
NotFiniteNumberException对象不是一个有效的成员
NotSupportedException调用的方法在类中没有实现
NullReferenceException试图使用一个未分配的引用
OutOfMemoryException内存空间不够
PlatformNotSupportedException平台不支持某个特定属性时抛出该错误
StackOverflowException堆栈溢出

Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。

ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常。

异常处理

C# 以trycatch 块的形式提供了一种结构化的异常处理方案。使用这些块,把核心程序语句与错误处理语句分离开。

这些错误处理块是使用 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 类,你可以抛出这个对象。你可以在 catch 语句块中用 throw 语句抛出这个对象:

Catch(Exception e) { ... Throw e }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值