你真的懂异常(Exception)吗?

时间:2022-02-28 08:48:04

标签:

你真的懂异常(Exception)吗?

目录

异常介绍

异常的特点

怎样使用异常

处理异常的 try-catch-finally

捕获异常的 Catch 块

释放资源的 Finally 块

一、异常介绍

  我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序。 异常处理所涉及到的关键字有 try、catch 和 finally 等,用来处理失败的情况。 CLR、.NET 自身的类库、其它第三方库或者你写的程序代码都有可能会出现异常。当然,你也可以直接使用 throw ,通过显式的形式来进行创建异常。

  在你的代码中出现异常的时候,程序会找到并执行最先匹配的 catch 块。 如果在调用堆栈中的任意位置中,异常处理程序都没有找到合适(你写的)的 catch 块,就会自动终止该进程,并向用户显示(抛出)一条错误的信息。

  在这里我写了个被 0 除会出现的异常(一个显式引发 DivideByZeroException 异常)并捕获该异常的示例:

1 /// <summary> 2 /// 除法 3 /// </summary> 4 /// <param></param> 5 /// <param></param> 6 /// <returns></returns> 7 static double Division(double x, double y) 8 { 9 if (y == 0) 10 { 11 throw new DivideByZeroException(); 12 } 13 14 return x / y; 15 } 16 17 static void Main(string[] args) 18 { 19 //定义两个变量 x, y 20 double x = 250, y = 0; 21 22 try 23 { 24 var result = Division(x, y); 25 Console.WriteLine($"result: {result}"); 26 } 27 catch (DivideByZeroException e) 28 { 29 30 Console.WriteLine(e); 31 } 32 33 Console.Read(); 34 }

二、异常的特点

所有异常类型(包括自定义的异常)都是由基类 Exception 派生的。

使用 try 块包围你认为可能会出现异常的代码。

一旦 try 块中发生异常,控制流将按顺序找到与之关联的 catch 块,如果没有找到合适的,就会引发最终的异常基类 Exception 内的处理程序(前提你已经 catch)。

如果出现异常却没有对应的异常处理程序,则该程序将会停止执行,并抛出对应错误的信息。

在 catch 定义了的异常变量,可以获取对应异常类型的信息。比如调用堆栈的状态和错误的说明,具体看 Excetion 的属性。

throw 关键字可以显式引发异常。

即使出现异常也会执行 finally 块中的代码。一般来说,我们会使用 finally 块释放资源,例如,关闭xx流。

三、怎样使用异常

  程序在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch。 异常也可以由 .NET 的 CLR 或由程序中的代码引发, 一旦引发了异常,这个异常将会在调用堆栈中一直向上进行传播,直到寻找到跟它匹配的 catch 语句。没有 catch 的异常会由系统提供的默认的异常处理程序进行处理,也就是你经常看到的一个突然造成调试中断并显示异常信息的对话框。