文章教程

7.1ASP.NET应用程序异常处理

8/31/2020 9:37:14 PM 人评论 次浏览

7.1 ASP.NET应用程序异常处理

这里遇到的错误一般指逻辑错误,尤其是在业务逻辑非常复杂的系统中,很多逻辑错误都隐藏得非常深。程序已经经过了反复测试,但还是会有逻辑错误产生。为了让程序运行更加稳定并处理这些隐藏得比较深的逻辑错误,需要将程序的异常进行处理,处理机制为捕获异常、处理异常或记录异常,然后继续运行程序。显示没有处理异常的程序,效果如图7-1所示。

alt

图7-1 没有处理的异常

7.1.1 异常处理基础

在程序开发中,一般采用异常处理程序。下面是没有做过异常处理的页面的运行结果,代码如下。

alt

在上面代码中,为没有分配空间的对象赋值产生一个错误,错误结果如图7-2所示。

alt

图7-2 产生错误

这样的界面极不友好,给客户带来的体验很差,而且没有处理的异常也会导致程序崩溃。客户对于这样的程序肯定是不能接受的,对于产品来讲也是致命问题。经过异常处理的程序,一般都采用try…catch语句块来捕获异常,在catch中处理异常,才不会导致程序崩溃,代码如下。

alt

这里捕获异常后直接输出到界面上,结果如图7-3所示。

alt

图7-3 捕获异常并且输出

这样经过处理后的程序,界面就友好很多,程序也不会崩溃。这样的处理机制只有在高级语言中才存在,因为这些程序是运行在托管的安全环境下的,当然也可以使用到非托管代码。

7.1.2 Exception类

所有的异常都包括在System.Exception类中。程序编写人员可以通过这个类来捕获系统产生的异常,也可以使用这个类来抛出自己产生的异常信息。如果异常没有捕获处理系统将抛出异常,导致程序崩溃不能继续运行而且显示一个详细的异常信息于界面上,这是用户很难接受的。现在来看异常处理基础类的属性、方法和事件,如表7-1所示。

表7-1 异常处理的基础类

alt

alt

7.1.3 捕捉异常

在程序中异常的处理方式首先是要捕获异常,然后处理异常。在程序中采用try…catch…finally这样的语句来处理异常。程序中使用try语句块时,表示在语句块中尝试运行,这个语句块中所执行的语句如果涉及线程等操作,就要单独处理。但是在程序中try语句块还是能够捕获到大多数的异常。在尝试之后使用catch捕获异常,catch英文是捕捉。一般在开发程序时会使用两个catch来捕获异常,一个有针对性的异常捕获和一个广泛的异常捕获。在没有发送预料之外的异常情况时,广泛的异常将捕获所有的异常信息。具体的代码结构如下。

alt

上面代码中使用了两个异常捕获部分:第一个捕获对象为空的异常;第二个捕获其他异常。代码执行结果如图7-4所示。

alt

图7-4 异常处理

在异常处理中,也可以调用内部或外部方法,这样的处理方式是异常处理或嵌套异常处理。

7.1.4 异常的嵌套

在异常处理中调用其他方法时,其他内部或外部方法在捕获异常后都将重新抛出异常,在程序开发的过程中,外部方法都将抛出异常,通常的做法是由调用者来处理抛出的异常,这样的处理方式为异常的嵌套。具体的代码如下。

alt

上面的代码段在程序中调用了一个内部方法。在内部方法中又另外调用了一个内部方法,在这两个方法中分别都进行了异常处理,这样的异常处理方式结构为异常嵌套,执行结果如图7-5所示。

alt

图7-5 异常嵌套处理

7.1.5 自定义异常

在异常处理过程中,程序开发通常都需要对异常进行自定义的处理方式,可以让调用方法的开发人员能够清晰地知道错误或者是逻辑问题出现的地方,这样就需要异常的自定义信息。下面通过代码来看具体操作,代码如下。

alt

上面的代码中建立了一个自定义的异常处理类,这个类继承了系统的异常处理类,这个自定义的异常处理类调用了父类的对象,将自定义的信息传递过去。具体的使用方法代码如下。

alt

代码中在异常处理部分,抛出了一个自定义的异常,捕获后输出结果,结果如图7-6所示。

alt

图7-6 自定义异常信息

7.1.6 finally语句块

在所有程序中,无论对异常采取什么样的处理方式,或者其他的执行操作finally都将被最终执行,这也是finally存在的意义,如网络、现场、数据库,I/O等操作中对于硬件资源的占用,最后都将被释放,也必须被释放。所有系统中都存在finally语句块,无论程序执行完成,或者执行到其中的一部分,语句块中的语句都将被执行。一般这样的语句块用来释放资源、关闭连接等操作。下面通过代码来看具体的执行步骤。

alt

代码捕获了一个自定义的异常信息,然后输出一个时间,执行结果如图7-7所示。

alt

图7-7 最终将被执行的代码

教程类别