转载->C#异常处理

摘要:
C#异常处理异常是在程序执行期间出现的问题。C#中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。C#异常处理时建立在四个关键词之上的:try、catch、finally和throw。catch关键字表示异常的捕获。C#中的异常类主要是直接或间接地派生于System.Exception类。System.InvalidCastException处理在类型转换期间生成的错误。异常处理C#以try和catch块的形式提供了一种结构化的异常处理方案。
C#异常处理

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

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

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

语法

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

使用 try/catch 语法如下所示:

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.ApplicationExceptionSystem.SystemException类是派生于 System.Exception 类的异常类。

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

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

下表列出了一些派生自 Sytem.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 块的形式提供了一种结构化的异常处理方案。使用这些块,把核心程序语句与错误处理语句分离开。

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

1 usingSystem;
2 namespaceErrorHandlingApplication
3 {
4     classDivNumbers
5 {
6         intresult;
7 DivNumbers()
8 {
9             result = 0;
10 }
11         public void division(int num1, intnum2)
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 = newDivNumbers();
30             d.division(25, 0);
31 Console.ReadKey();
32 }
33 }
34 }

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

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

创建用户自定义异常

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

1 usingSystem;
2 namespaceUserDefinedException
3 {
4    classTestTemperature
5 {
6       static void Main(string[] args)
7 {
8          Temperature temp = newTemperature();
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 classTempIsZeroException: ApplicationException
22 {
23    public TempIsZeroException(string message): base(message)
24 {
25 }
26 }
27 public classTemperature
28 {
29    int temperature = 0;
30    public voidshowTemp()
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 }

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

TempIsZeroException: Zero Temperature found

抛出对象

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

1 Catch(Exception e)
2 {
3 ...
4 Throw e
5 }

本文转自:菜鸟教程http://www.runoob.com/csharp/csharp-exception-handling.html

免责声明:文章转载自《转载->C#异常处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS 模态视图linux安装lua相关编译报错下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

zookeeper适用场景:配置文件同步

问题导读:1.本文三个角色之间是什么关系?2.三个角色的作用是什么?3.如何代码实现这三个角色的作用?在 zookeeper适用场景:zookeeper解决了哪些问题有关于分布式集群配置文件同步问题的描述,本文介绍如何把zk应用到配置文件分发的场景。假设有三个角色 trigger:发布最新的配置文件数据,发送指令和数据给zk_agent,实现是下面的tr...

安卓系统中各镜像介绍

背景 对于安卓开发而言,了解各镜像的意义、内容以及如何制作,有极大的意义。 注意,ROM中的5个镜像文件的扩展名都是img,但其格式却不同,也就是说不能使用同一种方法对其进行格式解析。 系统镜像(System.img) 系统镜像用于存储Android系统的核心文件,将其解压出来,就是设备中/system目录,里面包含了Android系统主要的目录和文件。一...

【自动化测试】使用Java+selenium填写验证码成功登录

  这是我第一次发博客,若有问题,请多多指教!   本次是为了帮忙解决,如果在平时自动化遇到有验证码填写的情况,我们如何成功登录情况。 思路:     首先我们先将验证码复制并保存成一个图片,然后使用tesseract-ocr这个光学软件识别成txt文件,接着我们只要读取txt文件的内容即可    2. 使用工具:     Eclipse、selenium...

python mock接口返回数据(转载)

Python mock  在测试过程中,为了更好地展开单元测试,mock一些数据跟对象在所难免,下面讲一下python的mock的简单用法。 关于python mock,网上有很多资料,这里不会讲的特别深,但一定会是实用为主,看完后,至少可以让你知道mock是怎样用的。 1.mock对象方法中的返回数据: 我们经常会需要这样的场景,a系统跟b系统联调,b...

为DataGrid添加自动编号功能

下面的代码实现在DataGrid中添加自动编号的功能,主要是在数据绑定时利用Item属性。 DataGridWithLine.aspx <%@ Page Language="vb" AutoEventWireup="false" Codebehind="DataGridWithLine.aspx.vb"Inherits="aspxWeb.DataG...

关于C#中async/await中的异常处理(上)

关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制。不过对于异步编程来说,异常处理一直是件麻烦的事情,这也是C#中async/awa...