十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
C#异常处理
普陀网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联自2013年创立以来到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
正如许多OOP语言一样,C#也能处理可遇见的,反常条件(丢失网络连接,文件丢失)下的异常。当应用程序遇到异常情况,它将“抛”出一个异常,并终止当前方法,直到发现一个异常处理,那个堆栈才会清空。
这意味着如果当前运行方法没有处理异常,那么将终止当前方法,并调用方法,这样会得到一个处理异常的机会。如果没有调用方法处理它,那么该异常最终会被CLR处理,它将终止程序
可以使用try/catch块来检测具有潜在危险的代码,并使用操作系统或者其他代码捕捉任何异常目标。Catch块用来实现异常处理,它包含一个执行异常时间的代码块,理想情况下,如果捕捉并处理了异常,那么应用程序可以修复这个问题并继续运行下去。及时应用程序不能继续运行,也可以捕捉这些异常,并显示有意义的错误信息,使应用程序安全种植。同时,你也有机会将这些错误书写入日志中。
如果在方法中有一段代码无论是否碰到以外都必须运行(例如,释放已经分配的资源,关闭一个打开的文件)那么可以吧代码放在finally块中。这样甚至在存在异常的代码中也能保证其运行。
一、C#异常的发生
公共语言运行库支持基于异常对象和受保护代码块概念的异常处理模型.即当运行库在异常发生时,运行库就会创建一个表示该异常的对象.当然你也可以通过从适当的基异常派生类来创建自己的异常类.
当发生非致命应用程序错误时,就会引发ApplicationException 类及其派生类类型的异常.
我们可以通过使用Throw语句显式引发异常. 也可以使用Throw语句再次引发已经捕获的异常. 好的编码做法是向再次引发的异常添加信息以在调试时提供更多信息. 而异常的处理方法,在所有使用运行库的语言都以相似的方式处理异常. 即大多数语言都使用try/catch/finally形式的结构化异常处理.
二、C#使用 try/catch 块捕捉异常
公共语言运行库提供一种异常处理模型,该模型基于对象形式的异常表示形式, 即将程序代码和异常处理代码分到try 块和 catch 块中.可以有一个或多个 catch块,每个块都设计为处理一种特定类型的异常,或者将一个块设计为捕捉比其他块更具体的异常. 如果要处理在应用程序在执行期间某代码块发生的异常,则必须先该代码块放置在 try 块中. (try 语句中的代码是try 块), 并将处理由try 块引发的异常的应用程序代码放在 catch语句中,称为catch块. 零个或多个catch块与一个 try 块相关联,每个 catch块包含一个确定该块能够处理的异常类型的类型筛选器.在try 块中出现异常时,系统按所关联 catch块在应用程序代码中出现的顺序搜索它们, 直到定位到处理该异常的catch块为止. 如果某catch块的类型筛选器指定了异常类型T或任何派生由异常类型T派生的异常类型,的则该catch块处理 T类型及其派生类型的异常. 系统在找到第一个处理该异常的catch 块后即停止搜索.因此,正如本节后面的示例所演示的那样,在应用程序代码中处理某类型异常的 catch块必须在处理其基类型的 catch块之前指定,所以通常处理 System.Exception 的catch 块最后指定. 如果与try块相关联的所有 catch块均不处理该异常,且当前 try 块嵌套在其他 try 块中, 则搜索与上一级 try块相关联的 catch 块. 如果仍然没有找到用于该异常的catch 块, 则将该异常沿调用堆栈向上传递,搜索上一个堆栈帧(即当前方法(或函数)的主调方法(或函数)) 来查找处理该异常的catch 块,并一直查找,直到该异常得到处理或调用堆栈中没有更多的帧为止. 如果到达调用堆栈顶部却没有找到处理该异常的catch块,则由默认的异常处理程序处理该异常, 然后应用程序终止.
细节:当发生异常时,该异常会沿堆栈向上传递,并查找合适catch块. 由前面看出catch语句的顺序很重要,应该将针对处理特定异常的 catch块放在处理常规异常(一般指定某种异常的基类) catch块的前面,否则编译器可能会发出错误. catch块的查找方法是将异常的类型与 catch块中指定的异常名称进行匹配. 如果没有找到特定的catch块,则由存在的常规 catch块捕捉异常.如果也没有处理常规异常的 catch块,公共语言运行库捕捉catch 块没有捕捉的异常.根据运行库的配置,或者出现一个调试对话框, 或者程序停止执行并出现一个包含异常信息的对话框.
三、C#异常处理办法和分类
1、c#中所有的异常处理都被视为类,所有异常都是由System.Exception所派生的。
2、C#中处理错误异常管理的关键字指令有四个:try、catch、throw、finally,有这四个关键字所编写的异常处理功能非常的强大与方便。
3、异常处理的语法:try{有可能产生错误的代码}catch(异常处理声明(声明此catch区段要捕获哪一种类型的异常错误,可以不用声明,这样子便会让catch去捕获任意类型的异常错误)){异常处理程序代码(当catch捕获到异常错误后,所采取对应的程序代码)}
注意:利用catch来捕获try-catch中产生的异常错误,可以建立多个catch区段以捕获不同类型的异常错误。
3、C#中常见异常类:
类 说明
OutOfMemoryException 当利用new关键字去初始化分配一块内存失败时
StackOverflowException 当执行程序有利用到堆栈资源时(通常是执行Recursion或太多的循环),将堆栈资源耗尽时
NullReferenceException 当要利用Reference对象时,却是NullReference
TypeInitializationException 若静态对象发生错误,但又缺乏catch区段去处理与对应时
ArrayTypeMismatchException 当存入数据与数组中数据类型不同时
IndexOutOfRangeException 当超过数组的限定范围时
MulticastNotSupportedException 当要合并两个委派对象失败时
ArithmeticException 一般在运算失败时,这包含了DivideByzeroException与OverflowException两种异常
DivideByzeroException 当使用除法运算时,分母为0所造成的错误时
OverflowException 当运算后超过数据类型的合法范围时
截获到你再throw抛出异常,必然是报错程序退出。
在Catch里面要么不抛出异常,要么根据情况处理
throw在自己写类时很有用处
比如调用StreamReader时,如果文件不存在,你的程序就会被IOException的异常打断,原因就是streamreader的一个过程throw了一个ioexception,说明它是用来丢异常的。
如果要获取这个异常,可以用try语句
try
可能有异常产生的代码
Catch ex As Exception
用ex代表异常,并对异常进行处理
End try
Err.Raise 错误代码
例如
Err.Raise 6
导致6号错误(溢出)
D
*******************
A肯定是正确的
B这是标准的处理方式
C用户可以从异常类派生自己的子类