小谈 C#异常
开篇我先问一下各位,C#异常的主要类型是什么?如何使用它们?我相信有一部分人答不上来,那么这篇文章将回答这两个问题以及与之相关的问题。让我们开始吧!!!
一、有什么异常?
异常是处理错误的机制,表示执行流程的突然中断。一旦引发异常执行就会停止,如果未处理异常,应用程序就会崩溃。那么我们该如何引发或捕获异常呢?这一部分将会来解答这个问题。
C#异常剖析
try
可以使用它来包裹住可能引发异常的代码。例如下面的代码:
上面代码中我们使用 ReadAllText 静态方法来读取指定文件的内容,但是该文件可能不存在,在这种情况下会引发异常。因此我们使用 try 来将其包裹住。但是仅仅只有 try 还是不够的,我们可以看到错误窗口中显示了这么一个错误提示:
显而易见,VS 提示我们还需要 catch 或 finally 代码块,因为处理异常但没有执行处理部分是没有任何意义的。
catch
catch 代码块使我们能够处理异常。我们将上面的代码补充完整:
如果不存在 test.txt 这个文件,运行上面的代码,会看到以下内容:
因为文件不存在引发 System.FileNotFoundException 异常,执行流程被中断。try 块中的“NO2”没有被输出,而是输出了 catch 块中的内容。
finally
在了解了 try 和 catch 之后,我们来学习 finally,它在开发中经常使用但又经常被误解的代码块。finally 块是一种确保无论是否引发异常,都会执行给定代码段的方式。我们进一步补充前面的代码:
运行代码,如果文件不存在,控制台将输出如下内容:
我们将 test.txt 文件创建到 g 盘根目录,再次运行代码,控制台将输出如下内容:
从上面两种情况可以看出,在没有引发异常的情况下 catch 块中没有执行任何代码。但不管是否发生异常,finally 都执行了代码。
throw 当涉及到异常时,我们需要自定义异常告知调用发发生了异常,这时可以使用 throw 关键字:
二、常见的.NET 异常
以下是常见的.NET 异常列表:
System.NullReferenceException 这时最常见的异常,当我们尝试调用方法、属性、索引器等时,就有可能会抛出此异常。例如下面的代码将导致空引用异常:
在上面的示例中,我们查询符合 SSN 等于 123 的第一个 person 对象。如果没有任何值,则它将返回该类型的默认值。由于 Person 是引用类型,因此其返回值为 null。然后我们调用 name,这时就会依引发空引用异常。但是这各一场我们一般不会抛出也不会捕获,因为这个异常通常是因为我们编码不当考虑不周导致的。如果要向调用方告知不可传 Null,则应该抛出 System.ArgumentNullException 异常。
System.IndexOutOfRangeException 这个异常和上一个异常一样,我们一般不会进行抛出和捕获,这时因为这个异常通常是我们使用无效的索引值访问数组、列表以及任何可索引序列中的元素时引发的。
System.IO.IOException 这个异常是 IO 操作期间发生引发的。与前两个异常不同,我们可能会不时捕捉或抛出它。IOException 类实际上包含了一些更具体的异常,常见的有:
DirectoryNotFoundException
EndOfStreamException
FileNotFoundException
FileLoadException
PathTooLongException
System.Net.WebException 这个异常与网络有关,处理此异常时,一定要验证 Response 属性,这个属性包含远程主机返回的响应。
System.Data.SqlClient.SqlException 这个异常与数据库有关。SQL Server 返回错误或警告时将引发这个异常。SqlException 类具有一个称为 Errors 属性,该属性是一个包含 SqlError 该类的一个或多个实例集合。包含有关发生的错误的详细信息。
System.StackOverflowException 当执行堆栈溢出时会抛出此异常,这通常意味着递归出错,代码有太多的嵌套方法调用。这个异常是无法捕获的从.NET 2.0 起就没办法捕获,这意味着当抛出该异常时几乎没有其他选择。默认情况下,代码执行过程将被终止。
System.InvalidCastException 当执行了无效的强制转换或显式转换时引发的异常。以下代码将引发此类型的异常:
我们可以利用泛型来防止陷入需要强制转换的情况。
三、总结
错误处理是经常被忽略的话题,如果没有可靠的错误处理方法,您的应用程序有可能质量会不过关。通过本文,我希望通过定义异常的概念并对 C#异常的主要类型进行快速概述,来帮助你解决一些问题。但是本文并没有涵盖异常处理的全部,我希望这本文可以开始引导你对该主题的学习。
版权声明: 本文为 InfoQ 作者【喵叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/7da838121630c9e98e9c0ef2b】。未经作者许可,禁止转载。
评论