开篇我先问一下各位,C#异常的主要类型是什么?如何使用它们?我相信有一部分人答不上来,那么这篇文章将回答这两个问题以及与之相关的问题。让我们开始吧!!!
异常是处理错误的机制,表示执行流程的突然中断。一旦引发异常执行就会停止,如果未处理异常,应用程序就会崩溃。那么我们该如何引发或捕获异常呢?这一部分将会来解答这个问题。
可以使用它来包裹住可能引发异常的代码。例如下面的代码:
string content = string.Empty;
try
{
content = System.IO.File.ReadAllText(@"g:\test.txt");
}
上面代码中我们使用ReadAllText静态方法来读取指定文件的内容,但是该文件可能不存在,在这种情况下会引发异常。因此我们使用try来将其包裹住。但是仅仅只有try还是不够的,我们可以看到错误窗口中显示了这么一个错误提示:
显而易见,VS提示我们还需要catch或finally代码块,因为处理异常但没有执行处理部分是没有任何意义的。
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块中的内容。
在了解了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都执行了代码。
public ProductService(IProductRepository repository)
{
if (repository == null)
throw new ArgumentNullException();
this.repository = repository;
}
以下是常见的.NET异常列表:
Person p = people.Where(x => x.SSN == "123").FirstOrDefault();
string name = p.Name;
在上面的示例中,我们查询符合SSN等于123的第一个person对象。如果没有任何值,则它将返回该类型的默认值。由于Person是引用类型,因此其返回值为null。然后我们调用name,这时就会依引发空引用异常。但是这各一场我们一般不会抛出也不会捕获,因为这个异常通常是因为我们编码不当考虑不周导致的。如果要向调用方告知不可传Null,则应该抛出System.ArgumentNullException异常。
object o = "10";
int x = (int)o;
我们可以利用泛型来防止陷入需要强制转换的情况。
错误处理是经常被忽略的话题,如果没有可靠的错误处理方法,您的应用程序有可能质量会不过关。通过本文,我希望通过定义异常的概念并对C#异常的主要类型进行快速概述,来帮助你解决一些问题。但是本文并没有涵盖异常处理的全部,我希望这本文可以开始引导你对该主题的学习。