C#异常处理

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

异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:trycatchfinally 和 throw

  • try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
  • catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
  • finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
  • throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

语法

假设一个块将出现异常,一个方法使用 try 和 catch 关键字捕获异常。try/catch 块内的代码为受保护的代码,使用 try/catch 语法如下所示:

[csharp]  view plain  copy
  1. try  
  2. {  
  3.    // 引起异常的语句  
  4. }  
  5. catch( ExceptionName e1 )  
  6. {  
  7.    // 错误处理代码  
  8. }  
  9. catch( ExceptionName e2 )  
  10. {  
  11.    // 错误处理代码  
  12. }  
  13. catch( ExceptionName eN )  
  14. {  
  15.    // 错误处理代码  
  16. }  
  17. finally  
  18. {  
  19.    // 要执行的语句  
  20. }  

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

C# 中的异常类

C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception类。System.ApplicationException 和 System.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 处理栈溢出生成的错误。

异常处理

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

这些错误处理块是使用 trycatch 和 finally 关键字实现的。下面是一个当除以零时抛出异常的实例:

[csharp]  view plain  copy
  1. using System;  
  2. namespace ErrorHandlingApplication  
  3. {  
  4.     class DivNumbers  
  5.     {  
  6.         int result;  
  7.         DivNumbers()  
  8.         {  
  9.             result = 0;  
  10.         }  
  11.         public void division(int num1, int num2)  
  12.         {  
  13.             try  
  14.             {  
  15.                 result = num1 / num2;  
  16.             }  
  17.             catch (DivideByZeroException e)  
  18.             {  
  19.                 Console.WriteLine("Exception caught: {0}", e);  
  20.             }  
  21.             finally  
  22.             {  
  23.                 Console.WriteLine("Result: {0}", result);  
  24.             }  
  25.   
  26.         }  
  27.         static void Main(string[] args)  
  28.         {  
  29.             DivNumbers d = new DivNumbers();  
  30.             d.division(25, 0);  
  31.             Console.ReadKey();  
  32.         }  
  33.     }  
  34. }  

当上面的代码被编译和执行时,它会产生下列结果:

[csharp]  view plain  copy
  1. Exception caught: System.DivideByZeroException: Division by zero  
  2.   at ErrorHandlingApplication.DivNumbers.division (Int32 num1, Int32 num2) [0x00000] in :0   
  3. Result: 0  

创建用户自定义异常

您也可以定义自己的异常。用户自定义的异常类是派生自 ApplicationException 类。下面的实例演示了这点:

[csharp]  view plain  copy
  1. using System;  
  2. namespace UserDefinedException  
  3. {  
  4.    class TestTemperature  
  5.    {  
  6.       static void Main(string[] args)  
  7.       {  
  8.          Temperature temp = new Temperature();  
  9.          try  
  10.          {  
  11.             temp.showTemp();  
  12.          }  
  13.          catch(TempIsZeroException e)  
  14.          {  
  15.             Console.WriteLine("TempIsZeroException: {0}", e.Message);  
  16.          }  
  17.          Console.ReadKey();  
  18.       }  
  19.    }  
  20. }  
  21. public class TempIsZeroException: ApplicationException  
  22. {  
  23.    public TempIsZeroException(string message): base(message)  
  24.    {  
  25.    }  
  26. }  
  27. public class Temperature  
  28. {  
  29.    int temperature = 0;  
  30.    public void showTemp()  
  31.    {  
  32.       if(temperature == 0)  
  33.       {  
  34.          throw (new TempIsZeroException("Zero Temperature found"));  
  35.       }  
  36.       else  
  37.       {  
  38.          Console.WriteLine("Temperature: {0}", temperature);  
  39.       }  
  40.    }  
  41. }  

当上面的代码被编译和执行时,它会产生下列结果:

[csharp]  view plain  copy
  1. TempIsZeroException: Zero Temperature found  

抛出对象

如果异常是直接或间接派生自 System.Exception 类,您可以抛出一个对象。您可以在 catch 块中使用 throw 语句来抛出当前的对象,如下所示:

[csharp]  view plain  copy
  1. Catch(Exception e)  
  2. {  
  3.    ...  
  4.    Throw e  
  5. }  

猜你喜欢

转载自blog.csdn.net/weixin_39029925/article/details/78212097