Csharp/C#教程:浅谈C#中简单的异常引发与处理操作分享

异常和异常处理
C#语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况。异常处理使用try、catch和finally关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做。公共语言运行时(CLR)、.NETFramework或任何第三方库或者应用程序代码都可以生成异常。异常是使用throw关键字创建的。
很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所引发。在这种情况下,CLR将展开堆栈,查找是否有方法包含针对该特定异常类型的catch块,如果找到这样的方法,就会执行找到的第一个这样的catch块。如果在调用堆栈中的任何位置都没有找到适当的catch块,就会终止该进程,并向用户显示一条消息。
此示例中使用一个方法检测是否有被零除的情况;如果有,则捕获该错误。如果没有异常处理,此程序将终止并产生“DivideByZeroException未处理”错误。

classExceptionTest { staticdoubleSafeDivision(doublex,doubley) { if(y==0) thrownewSystem.DivideByZeroException(); returnx/y; } staticvoidMain() { //Inputfortestpurposes.Changethevaluestosee //exceptionhandlingbehavior. doublea=98,b=0; doubleresult=0; try { result=SafeDivision(a,b); Console.WriteLine("{0}dividedby{1}={2}",a,b,result); } catch(DivideByZeroExceptione) { Console.WriteLine("Attempteddividebyzero."); } } }

异常概述
异常具有以下特点:

各种类型的异常最终都是由System.Exception派生而来。 在可能引发异常的语句周围使用try块。 一旦try块中发生异常,控制流将跳转到第一个关联的异常处理程序(无论该处理程序存在于调用堆栈中的什么位置)。在C#中,catch关键字用于定义异常处理程序。 如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误消息。 除非您可以处理某个异常并使应用程序处于已知状态,否则请不要捕捉该异常。如果捕捉System.Exception,请在catch块的末尾使用throw关键字再次引发该异常。 如果catch块定义了一个异常变量,则可以用它获取有关所发生异常类型的更多信息。 程序可以使用throw关键字显式地引发异常。 异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。 即使发生异常也会执行finally块中的代码。使用finally块释放资源,例如,关闭在try块中打开的任何流或文件。

使用异常
在C#中,程序中的运行时错误通过使用一种称为“异常”的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕捉。异常可由.NETFramework公共语言运行时(CLR)或由程序中的代码引发。一旦引发了一个异常,这个异常就会在调用堆栈中往上传播,直到找到针对它的catch语句。未捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框。
异常由从Exception派生的类表示。此类标识异常的类型,并包含详细描述异常的属性。引发异常涉及到创建一个异常派生类的实例,配置异常的属性(可选),然后使用throw关键字引发该对象。例如:

classCustomException:Exception { publicCustomException(stringmessage) { } } privatestaticvoidTestThrow() { CustomExceptionex= newCustomException("CustomexceptioninTestThrow()"); throwex; }

在引发异常之后,运行时检查当前语句以确定它是否在try块中。如果是,则检查与该try块关联的任何catch块,以确定它们是否能够捕获该异常。Catch块通常会指定异常类型;如果该catch块的类型与异常或异常的基类的类型相同,则该catch块就能够处理该方法。例如:

staticvoidTestCatch() { try { TestThrow(); } catch(CustomExceptionex) { System.Console.WriteLine(ex.ToString()); } }

如果引发异常的语句不在try块中,或者包含该语句的try块没有匹配的catch块,运行时将检查调用方法中是否有try语句和catch块。运行时将在调用堆栈中向上继续搜索兼容的catch块。在找到并执行catch块之后,控制权将传递给catch块之后的下一个语句。
一个try语句可能包含多个catch块。将执行第一个能够处理该异常的catch语句;任何后续的catch语句都将被忽略,即使它们是兼容的也如此。因此,在任何情况下都应该按照从最具体(或者派生程度最高)到最不具体这一顺序排列catch块。例如:

staticvoidTestCatch2() { System.IO.StreamWritersw=null; try { sw=newSystem.IO.StreamWriter(@"C:testtest.txt"); sw.WriteLine("Hello"); } catch(System.IO.FileNotFoundExceptionex) { //Putthemorespecificexceptionfirst. System.Console.WriteLine(ex.ToString()); } catch(System.IO.IOExceptionex) { //Putthelessspecificexceptionlast. System.Console.WriteLine(ex.ToString()); } finally { sw.Close(); } System.Console.WriteLine("Done"); }

执行catch块之前,运行时会检查finally块。Finally块使程序员能够清除中止的try块可能遗留下的任何模糊状态,或者释放任何外部资源(例如图形句柄、数据库连接或文件流),而无需等待运行时中的垃圾回收器终结这些对象。例如:

staticvoidTestFinally() { System.IO.FileStreamfile=null; //Changethepathtosomethingthatworksonyourmachine. System.IO.FileInfofileInfo=newSystem.IO.FileInfo(@"C:file.txt"); try { file=fileInfo.OpenWrite(); file.WriteByte(0xF); } finally { //Closingthefileallowsyoutoreopenitimmediately-otherwiseIOExceptionisthrown. if(file!=null) { file.Close(); } } try { file=fileInfo.OpenWrite(); System.Console.WriteLine("OpenWrite()succeeded"); } catch(System.IO.IOException) { System.Console.WriteLine("OpenWrite()failed"); } }

如果WriteByte()引发了异常,那么在没有调用file.Close()的情况下,第二个try块中尝试重新打开文件的代码就会失败,并且文件将保持锁定状态。由于要执行finally块(即使已引发异常),前一示例中的finally块使得可以正确地关闭文件,从而帮助避免错误。
如果在引发异常之后没有在调用堆栈上找到兼容的catch块,则会出现三种情况中的一种:
如果异常出现在析构函数中,则中止该析构函数并调用基析构函数(如果有)。
如果调用堆栈包含静态构造函数或静态字段初始值设定项,则引发一个TypeInitializationException,并将原始异常分配给新异常的InnerException属性。
如果到达线程的开头,则终止线程。

您可能感兴趣的文章:C#解决SQlite并发异常问题的方法(使用读写锁)详解C#编程中异常的创建和引发以及异常处理解析C#中断言与异常的应用方式及异常处理的流程控制轻松学习C#的异常处理C#中抛出异常用法实例C#WinForm捕获未处理的异常实例解析c#实现把异常写入日志示例(异常日志)C#异常处理详解解析c#在未出现异常情况下查看当前调用堆栈的解决方法学会使用C#异常

标签: 操作 异常

C语言数据结构之平衡二叉树(AVL树)实现方法示例

linux下C/C++学生信息管理系统

上述就是C#学习教程:浅谈C#中简单的异常引发与处理操作分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/907000.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐