您当前的位置:首页 > 文章 > C#学习记录——错误处理/异常处理

C#学习记录——错误处理/异常处理

作者:雷工笔记 时间:2023-03-23 阅读数:427 人阅读

『所谓辉煌的人生,不过是欲望的囚徒。』—— 网络

大多数人不过是普通人,过的不过是是普通的人生,但普通并不等于平凡,持续学习,用自己喜欢的方式过一生。加油!!!

错误处理

本篇的第一部分学习如何在应用程序的开发过程中查找和改正错误,使这些错误不会在发布的代码中出现。但有时,我们知道可能会有错误发生,但不能100%地肯定他们不会发生。此时,最好能预料到错误的发生,编写足够健壮的代码以处理这些错误,而不必中断程序的执行。

错误处理就是用于这个目的。下面学习异常和处理他们的方式。
异常在名称空间中定义,大多数异常的名称清晰地说明了它们的用途。在这个示例中,产生的异常称为System.IndexOutOfRangeException,说明我们提供的myArray数据索引不在允许使用索引范围内。只有在异常未处理时,这个信息才会显示出来,应用程序也才会中断执行。

1、异常处理概述

异常处理是一种功能强大的机制,用于处理应用程序可能产生的错误或是其他可以中断程序执行的异常情况。异常处理可以捕捉程序执行所发生的错误。通过异常处理可以有效、快速地构建各种用来处理程序异常情况的程序代码。

异常类 说明
System.ArithmeticException 在算术运算期间发生的异常
System.ArrayTypeMismatchException 当存储一个数组时,如果由于被存储的元素的实际类型与数组的实际类型不兼容而导致存储失败,就会引发此异常
System.DivideByZeroException 在试图用零除整数值时引发
System.IndexOutOfRangeException 在试图用小于零或超出数组界限的下标索引数组时引发
System.InvalidCastException 当从基类型或接口到派生类型的显示转换在运行时失败,就会引发此异常
System.NullReferenceException 在需要使用引用对象的场合,如果使用null引用,就会引发此异常

2、异常处理语句

2.1、try…catch语句

try…catch语句允许在try后面的大括号{}中放置可能发生异常情况的程序代码,对这些程序代码进行监控。在catch后面的大括号{}中则放置处理错误的程序代码,以处理程序发生的异常。try…catch语句的基本格式如下。

try
{  被监控的代码
}
catch(异常类名,异常变量名)
{  异常处理
}
		

2.2、throw语句

throw语句用于主动引发一个异常,使用throw语句可以在特定的情形下,自行抛出异常。throw语句的基本格式如下。

throw ExObject

ExObject:所要抛出的异常对象,这个异常对象是派生自System.Exception类的对象。

2.3、try…catch…finally语句

将finally语句与try…catch语句结合,形成try…catch…finally语句。finally语句同样以区块的方式存在,它被放在所有try…catch语句的最后面,程序执行完毕,最后都会跳到finally语句区块,执行其中的代码。

try
{  被监控的代码
}
catch(异常类名 异常变量名)
{  异常处理
}
finally
{  程序代码
}
		

C#语言包含结构化异常处理的语法。用3个关键字可以标记出能处理异常的代码和指令,如果发生异常,就使用这些指令处理异常。用于这个目的的3个关键字是try、catch和finally。它们都有一个关联的代码块,必须在连续的代码行中使用。其基本结构如下:

try
{  ...
}  catch(<exceptionType> e) when(filterIsTrue)  {  <await methodName(e);>  ...  }  finally  {  <await method name>  ...  }
		

也可以在catch或finally块内使用C# 6引入的await。await关键字用于支持先进的异步编程技术,避免瓶颈,且可以提高应用程序的总体性能和响应能力。

也可以只有try块和finally块,而没有catch块,或者有一个try块和好几个catch块。如果有一个或多个catch块,finally块就是可选的,否则就是必需的。这些代码块的用法如下:

1、try——包含抛出异常的代码(在谈到异常时,C#语言用“抛出”这个术语表示“生成”或“导致”)。

2、catch——包含抛出异常时要执行的代码。catch块可以使用,设置为只响应特定的异常类型,以便提供多个catch块。还可以完全省略这个参数,让通用的catch块响应所有异常。C#6 引入了一个概念“异常过滤”,通过在异常类型表达式后添加when关键字来实现。如果发生了该异常类型,且过滤表达式是true,就执行catch块中的代码。

3、finally——包含始终会执行的代码,如果没有产生异常,则在try块之后执行,如果处理了异常,则在catch块之后执行,或者在未处理的异常“上移到调用堆栈”之前执行。“上移到调用堆栈”表示SEH允许嵌套try…catch…fanally块,可以直接嵌套,也可以在try块包含的函数调用中嵌套。

在try块的代码中出现异常后,一次发生的事件如下,
在这里插入图片描述
注意:
如果存在两个处理相同异常类型的catch块,就只执行异常过滤器为true的catch块中的代码。如果还存在一个处理相同异常类型的catch块,但没有异常过滤器或异常过滤器是false,就忽略它。只执行一个catch块的代码,catch块的顺序不影响执行流。

3、列出和配置异常

.NET Framework包含许多异常类型,可以在代码中自由抛出和处理这些类型的异常。IDE提供了一个Exceptions对话框,可以检查和编辑可用的异样。使用Debug|Exceptions菜单项(或按下Ctrl+D,E)可以打开该对话框,如下所示:
在这里插入图片描述

该对话框按照类别和.Net库名称空间列出异常。展开Common Language Runtime Exceptions的加号,就可以看到System名称空间中的异常。
每个异常都可以使用右边的复选框来配置。使用(break when)Thrown时,即使是对于处理的异常,也会进入调试器。

要点

本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com