小谈C#异常

简介: 小谈C#异常

目录

一、有什么异常?

C#异常剖析

二、常见的.NET异常

三、总结


开篇我先问一下各位,C#异常的主要类型是什么?如何使用它们?我相信有一部分人答不上来,那么这篇文章将回答这两个问题以及与之相关的问题。让我们开始吧!!!

一、有什么异常?

异常是处理错误的机制,表示执行流程的突然中断。一旦引发异常执行就会停止,如果未处理异常,应用程序就会崩溃。那么我们该如何引发或捕获异常呢?这一部分将会来解答这个问题。


C#异常剖析

1.try

可以使用它来包裹住可能引发异常的代码。例如下面的代码:

string content = string.Empty;
try
{
    content = System.IO.File.ReadAllText(@"g:\test.txt");
}

上面代码中我们使用ReadAllText静态方法来读取指定文件的内容,但是该文件可能不存在,在这种情况下会引发异常。因此我们使用try来将其包裹住。但是仅仅只有try还是不够的,我们可以看到错误窗口中显示了这么一个错误提示:

image.png

显而易见,VS提示我们还需要catch或finally代码块,因为处理异常但没有执行处理部分是没有任何意义的。

3. catch

catch代码块使我们能够处理异常。我们将上面的代码补充完整:

static void Main(string[] args)
{
    string content = string.Empty;
    try
    {
      Console.WriteLine("NO1");
        content = System.IO.File.ReadAllText(@"g:\test.txt");
        Console.WriteLine("NO2");
    }
    catch
    {
        Console.WriteLine("发生异常");
    }
}

如果不存在test.txt这个文件,运行上面的代码,会看到以下内容:

NO1
发生异常

因为文件不存在引发System.FileNotFoundException异常,执行流程被中断。try块中的“NO2”没有被输出,而是输出了catch块中的内容。


4.finally

在了解了try和catch之后,我们来学习finally,它在开发中经常使用但又经常被误解的代码块。finally块是一种确保无论是否引发异常,都会执行给定代码段的方式。我们进一步补充前面的代码:

static void Main(string[] args)
{
    string content = string.Empty;
    try
    {
      Console.WriteLine("NO1");
        content = System.IO.File.ReadAllText(@"g:\test.txt");
        Console.WriteLine("NO2");
    }
    catch
    {
        Console.WriteLine("发生异常");
    }
    finally
    {
      Console.WriteLine("不管错与对,我都在");
    }
}

运行代码,如果文件不存在,控制台将输出如下内容:

NO1
发生异常
不管错与对,我都在

我们将test.txt文件创建到g盘根目录,再次运行代码,控制台将输出如下内容:

NO1
NO2
不管错与对,我都在

从上面两种情况可以看出,在没有引发异常的情况下catch块中没有执行任何代码。但不管是否发生异常,finally都执行了代码。

4. throw

当涉及到异常时,我们需要自定义异常告知调用发发生了异常,这时可以使用throw关键字:

public ProductService(IProductRepository repository)
{
    if (repository == null)
        throw new ArgumentNullException();
    this.repository = repository;
}

二、常见的.NET异常

以下是常见的.NET异常列表:

1. System.NullReferenceException

这时最常见的异常,当我们尝试调用方法、属性、索引器等时,就有可能会抛出此异常。例如下面的代码将导致空引用异常:

Person p = people.Where(x => x.SSN == "123").FirstOrDefault();
string name = p.Name;

在上面的示例中,我们查询符合SSN等于123的第一个person对象。如果没有任何值,则它将返回该类型的默认值。由于Person是引用类型,因此其返回值为null。然后我们调用name,这时就会依引发空引用异常。但是这各一场我们一般不会抛出也不会捕获,因为这个异常通常是因为我们编码不当考虑不周导致的。如果要向调用方告知不可传Null,则应该抛出System.ArgumentNullException异常。


2.System.IndexOutOfRangeException

这个异常和上一个异常一样,我们一般不会进行抛出和捕获,这时因为这个异常通常是我们使用无效的索引值访问数组、列表以及任何可索引序列中的元素时引发的。


3.System.IO.IOException

这个异常是IO操作期间发生引发的。与前两个异常不同,我们可能会不时捕捉或抛出它。IOException类实际上包含了一些更具体的异常,常见的有:


  • DirectoryNotFoundException
  • EndOfStreamException
  • FileNotFoundException
  • FileLoadException
  • PathTooLongException


4.System.Net.WebException

这个异常与网络有关,处理此异常时,一定要验证Response属性,这个属性包含远程主机返回的响应。


5.System.Data.SqlClient.SqlException

这个异常与数据库有关。SQL Server 返回错误或警告时将引发这个异常。SqlException类具有一个称为Errors属性,该属性是一个包含SqlError该类的一个或多个实例集合。包含有关发生的错误的详细信息。


6.System.StackOverflowException

当执行堆栈溢出时会抛出此异常,这通常意味着递归出错,代码有太多的嵌套方法调用。这个异常是无法捕获的从.NET 2.0起就没办法捕获,这意味着当抛出该异常时几乎没有其他选择。默认情况下,代码执行过程将被终止。


7.System.InvalidCastException

当执行了无效的强制转换或显式转换时引发的异常。以下代码将引发此类型的异常:

object o = "10";
int x = (int)o;

我们可以利用泛型来防止陷入需要强制转换的情况。


三、总结

错误处理是经常被忽略的话题,如果没有可靠的错误处理方法,您的应用程序有可能质量会不过关。通过本文,我希望通过定义异常的概念并对C#异常的主要类型进行快速概述,来帮助你解决一些问题。但是本文并没有涵盖异常处理的全部,我希望这本文可以开始引导你对该主题的学习。


目录
相关文章
|
8月前
|
SQL 存储 监控
实用技巧:排查数据异常/数据波动问题,该如何下手?
在我做开发的这些年,让我很头痛的一类问题,不是线上故障,而是数据异常,不知道有没有程序员跟我感同身受。大多数的服务故障都有较为直观的异常日志,再结合产品表象,相对排查起来还有迹可循,但数据异常的原因就太多了,很多时候连报错日志都没有,排查起来简直无从下手。
实用技巧:排查数据异常/数据波动问题,该如何下手?
|
8月前
GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数
GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数
204 0
|
6月前
|
算法 安全 区块链
IPPswap智能合约单边上涨/螺旋上涨质押lp挖矿模式系统开发指南教程/步骤需求
首先我们需要理解,IPPswap螺旋上涨项目系统是一种基于区块链的去中心化金融(DeFi)机制,其中将使用一种被称为"螺旋上涨"的模型以有利于持币者并降低投机行为。 开发IPPswap螺旋上涨项目系统,可能需要以下几个方面:
|
6月前
|
安全 Java 程序员
【C++11】异常知多少
【C++11】异常知多少
58 7
|
7月前
|
Java
JavaSE——模拟双色球业务(双色球业务介绍、总体实现步骤分析,代码+运行结果)
JavaSE——模拟双色球业务(双色球业务介绍、总体实现步骤分析,代码+运行结果)
98 7
|
8月前
|
编解码 安全 定位技术
典型崩溃问题集锦
典型崩溃问题集锦
56 0
|
8月前
|
算法 C++
C++100-C++拓展001-异常平方根计时功能
C++100-C++拓展001-异常平方根计时功能
|
数据可视化 C++
R可视乎|回归诊断(文末送书)
Lindia 是 ggplot2 的扩展,提供更详细的线性模型诊断结果的可视化功能。Lindia 中的所有函数输入都必须为 lm 对象(包括 lm()和 glm() ),并以 ggplot 对象的形式返回线性诊断图。
257 0
|
算法 数据处理
信用评分系统运行原理中篇-分箱逻辑(2)
信用评分系统运行原理中篇-分箱逻辑(2)
163 0
信用评分系统运行原理中篇-分箱逻辑(2)
信用评分系统运行原理中篇-分箱逻辑(3)
信用评分系统运行原理中篇-分箱逻辑(3)
215 0
信用评分系统运行原理中篇-分箱逻辑(3)