异常介绍
C# 语言的异常处理功能可以帮助你在处理程序运行时出现的意外或异常情况。 异常处理使用 try
、catch
和 finally
等关键字尝试执行某些操作,以处理失败情况,当然,尽管这些操作也有可能失败,如果你确定需要这样做,且希望在事后清理资源,就可以尝试这样做。 公共语言运行时 (CLR)、.NET 或任何第三方库或者应用程序代码都有可能会生成异常。 异常是你可以使用 throw
关键字显式进行创建。
很多情况下,异常很可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所引发。 在这种情况下,CLR 将展开堆栈,查找是否有方法包含针对该特定异常类型的 catch
块,如果找到这样的方法,就会执行找到的第一个这样的 catch
块。 如果在调用堆栈中的任何位置都没有找到适当的 catch
块,就会终止该进程,并向用户显示一条错误的信息。
请看示例,这里使用一个方法检测是否出现被零除的情况;如果有,则捕获该异常。 如果没有异常处理,此程序将终止并产生“DivideByZeroException 未处理”的错误。
1 /// <summary> 2 /// 除法 3 /// </summary> 4 /// <param name="x"></param> 5 /// <param name="y"></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 //假设 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
块的末尾使用throw
关键字再次引发该异常。 - 如果
catch
块定义了一个异常变量,则可以用它获取有关所发生异常类型的有关信息。 - 程序可以使用
throw
关键字显式地引发异常。 - 异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。
- 即使发生异常也会执行
finally
块中的代码。 一般来说,我们会使用finally
块释放资源,例如,关闭在try
块中打开的任何流或文件。 - 要知道,.NET 中的托管异常是凭借 Win32 结构化异常处理机制实现的。
C# 基础回顾系列
《C# 知识回顾 - 表达式树 Expression Trees》
《C# 知识回顾 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 了解常用的特性 Attribute》
《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》
《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件》
《string 与 String,大 S 与小 S 之间没有什么不可言说的秘密》
【博主】反骨仔
【出处】http://www.cnblogs.com/liqingwen/p/6193354.html
【参考】微软官方文档