异常处理,英文名为Exceptional Handling, 那时年少,还记得那年一起学习过的VB6.0的时候,常常使用ONError的错误语句。与传统VB6.0中的OnError语句相比.NET平台的异常处理机制更加灵活,而且使用更加方便。是代替日渐衰落的Error Code方法的新法,提供Error Code 所未能具体的优势。异常处理巧妙又不失完美的分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。

异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。异常处理通常是防止未知错误产生所采取的处理措施。异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高。

一、异常处理Try...Catch...Finally

<span style="font-size:18px;"><span style="font-size:18px;">    Try
        '程序代码
     Catch
       '处理异常的代码
    Finally
        '清理工作
    End Try</span></span>

在上述语句中,Try语句块通常存放的是我们需要检测可能存在异常情况的代码,也就是说如果程序正确,则执行Try语句块,Catch语句块负责捕捉到错误的代码。所以当这段代码在执行过程中产生异常,则转到Catch块中对该异常进行相应处理。最后,无论是否引发异常,Finally块中的代码最后一定会被执行。 Finaly块用于清除try块中分配的任何资源以及运行任何即使在发生异常时也必须执行的代码。Catch和Finally语句可以共同使用于一个Try块中。

简单来说,就是Try和Finally语句块是必须运行的,但是Catch语句不一定运行,如果Try块内的代码没有错误,没有抛出异常的话,Catch语句块中的代码是不运行的,而是跳过Catch块直接运行Finally块中的清理工作。反之如果遇到了异常Catch语句块中的处理工作就要进行。为什么在Finally块中进行清理工作?简单的说一个程序的异常会导致程序不能正常完成结束工作,而且在错误出现的地方跳出程序,直接执行Catch语句块中的代码,使得在程序运行时构建的对象资源不能释放,浪费了内存资源,同时也可能导致栈中数据存储的杂乱,所以无论有没有出现异常Finally块中的代码是一定会运行的。

       以VB.NET版机房收费系统中的注册为例,我们要如何在代码中应用异常处理呢?

<span style="font-size:18px;"><span style="font-size:18px;"> Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        Try
            Dim RegisterManager As New BLL.RegisterManager
            Dim studentinfo As New Entity.Studentinfo
            Dim cardinfo As New Entity.Cardinfo
            Dim rechargeinfo As New Entity.Rechargeinfo
        If (RegisterManager.query(txtStudentNo.Text) Is Nothing And RegisterManager.queryCard(txtCardNo.Text) Is Nothing) Then
                studentinfo.cardNo = txtCardNo.Text
                studentinfo.studentNo = txtStudentNo.Text
                studentinfo.studentName = txtName.Text
                studentinfo.sex = cmbSex.Text
                studentinfo.department = txtDepartment.Text
                studentinfo.grade = txtGrade.Text
                studentinfo.stuclass = txtClass.Text
                studentinfo.remark = txtRemark.Text
                studentinfo.Handler = frmLogin.handler.handler
                '用户显示层没有处理人这个文本框,怎么办?数据库里面handler这个字段的信息如何获取,答案就在上面哦。

                cardinfo.cardNo = txtCardNo.Text
                cardinfo.balance = txtbalance.Text
                cardinfo.status = "使用"
                cardinfo.registerDate = CStr(Format(Now(), "yyyy-MM-dd"))
                cardinfo.registerTime = CStr(Format(Now(), "HH:mm:ss"))
                cardinfo.handler = frmLogin.handler.handler
                cardinfo.ischeck = "未结账"

                rechargeinfo.cardNo = txtCardNo.Text
                rechargeinfo.rechargeAmount = txtbalance.Text
                rechargeinfo.rechargeDate = CStr(Format(Now(), "yyyy-MM-dd"))
                rechargeinfo.time = CStr(Format(Now(), "HH:mm:ss"))
                rechargeinfo.userID = frmLogin.handler.handler

                RegisterManager.insert(studentinfo)
                RegisterManager.insertCard(cardinfo)
                RegisterManager.insertRecharge(rechargeinfo)

                MsgBox("用户注册成功")
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
    End Sub</span></span>

如果,我们没有写捕获异常的这个语句,该注册在D层出错了,运行结果会怎样?

正如上图所示,她会直接跳到有错误的地方,但是如果在程序里面写了Try Catch,又会发生怎样的奇迹呢?

两种不同的报错方式,第二种给人的感觉更加直观,帮助我们理清了思绪,增强了代码可读性,方便维护者的阅读和理解。

二、 抛出异常

当程序出现异常状况时会导致系统提前跳出该程序,运用Catch捕捉异常,可使我们继续执行Catch的内容。try...catch 捕获的是系统自行检测出来的错误。如果我们需要自定义一些错误,例如检测到了卡号不存在等错误的时候,我们可以使用Throw 关键字来在程序中抛出异常。

        Throw关键字通常用于方法体中,并且抛出一个异常对象,如果一个方法没有捕获可能引发的异常,调用该方法的其他方法应该捕获并处理异常。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句。例如,为了保证逻辑的正确,在程序中判断如果有违逻辑的部分可以抛出一个异常,如:任何数都不能除0,如果0作为除数的话就要抛出一个异常,throw
new exception("0不能作为除数!")

代码如下:

<span style="font-size:18px;">Private Sub butnTest_Click(sender As Object, e As EventArgs) Handles Button1.Click  

        Try
            Dim g As Integer =3
            Dim h As Integer =0
            TextBox1.Text = GetTry(g, h)  

        Catch ex As Exception
            MsgBox("除数不能为0", vbOKOnly + vbInformation, "系统消息")  

        Finally
            MsgBox("结束")  

        End Try  

End Sub  

Private Function GetTry(ByVal a As Integer, b As Integer) As Integer  

        If b = 0 Then
            Dim excOurOwnException As New ArgumentException("除数不能为0")      '抛出异常
            Throw excOurOwnException
        End If  

End Function  </span>

使用异常处理,可以使大多数的正常代码与少数异常处理的分离,其次错误分类统一处理,最后通知使用者具体发生了什么错误。机房收费系统,未完,待续......

VB.NET版机房收费系统---异常处理的更多相关文章

  1. VB.NET版机房收费系统---导出Excel表格

    datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...

  2. VB.net版机房收费系统——结账功能实现(调错与优化)

    调错部分 上一篇博客<VB.net版机房收费系统--结账功能实现(代码部分>说的是结账功能的实现,亮出了代码.是在为这篇博客做铺垫.尽管结账功能代码是借鉴的巨人的博客.可是自己比着葫芦画瓢 ...

  3. VB.NET版机房收费系统---七仙女之系统登录

    VB.NET第一版机房收费系统,告一段落,验收的时候.问题也是大大的存在,没实用上设计模式,什么触发器.存储过程,都没实用上.看看其她小伙伴的,七层实现登录?那是什么东东,相比較我的三层而言,多了两倍 ...

  4. VB.NET版机房收费系统---报表

    报表,即报告情况的表格,简单的说:报表就是用表格.图表等格式来动态显示数据,可以用公式表示为:"报表 = 多样的格式 + 动态的数据". 在没有计算机以前,人们利用纸和笔来记录数据 ...

  5. VB.NET版机房收费系统---外观层如何写

    外观设计模式,<大话设计模式>第103页详细讲解,不记得这块知识的小伙伴可以翻阅翻阅,看过设计模式,敲过书上的例子,只是学习的第一步,接着,如果在我们的项目中灵活应用,把设计模式用出花儿来 ...

  6. VB.NET版机房收费系统---组合查询

    查询的意思就是查找,寻找,指在某一个或几个地方找出自己所要的信息,假如我想搜索一下我自己写的博客,名字叫做初雪之恋,我在百度的搜索框中输入丁国华三个字,会有怎样的惊喜等着我? 啊哦,这个信息并不是我想 ...

  7. VB.NET版机房收费系统---外观层怎样写

    外观设计模式.<大话设计模式>第103页具体解说,不记得这块知识的小伙伴能够翻阅翻阅,看过设计模式,敲过书上的样例,仅仅是学习的第一步,接着,假设在我们的项目中灵活应用,把设计模式用出花儿 ...

  8. VB.NET版机房收费系统—数据库设计

    之前第一遍机房收费的时候,用的数据库是别人的.认知也仅仅能建立在别人的基础上,等自考中<数据库系统原理>这本书学完了之后,再去看曾经的数据库,发现数据库真的还须要进一步的优化.以下是我设计 ...

  9. VB.NET版机房收费系统—DataGridView应用

    事实上,先前刚刚開始敲机房的时候,刚用到DataGridView的时候,总显得力不从心,先要一下子就学会,看了非常多的资料,但是依照写的时候,自己有不知道从什么地方下手,于是,当自己用查询SQL语句, ...

随机推荐

  1. SpringMVC之拦截器实现登录验证

    今天回头看之前发的javaweb学习路线图,发现把路线图中的也学的有一半多了,不过还是路漫漫.在前面的博客中有学习过spring的aop,它利用动态代理实现,在springmvc中也是一样,今天使用H ...

  2. 启动Docker容器

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. 新建并 ...

  3. YAML 在Python中的配置应用

    环境搭建 YAML语法 语法规则 数据结构 列表数组 原子量 YAML应用 案例 load dump 总结 YAML是一个堪比XML,JSON数据格式的更加方便,简洁的,易于人眼阅读的序列化数据格式. ...

  4. 判断&数学&生活

    作者:黄永刚 初次接触<概率论与数理统计>这门课的时候,脑袋中只有三个词:黑球.白球.袋子,所有的课程内容就是先取,后取,接触一月之后成功的被放趴下了,因此对于这门课程是没有什么好感的,考 ...

  5. ObjectOutputStream 和 ObjectInputStream的使用

    一.看一下API文档 ObjectOutputStream : ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInp ...

  6. Mybatis源码分析--返回值ResultType和ResultMap

    这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制.首先ResultType和ResultMap的使用方式是不同的. ResultType的使用方式: result ...

  7. 19 主线程向子线程发送信息(handler)

    package com.fmy.handler; import android.app.Activity; import android.os.Bundle; import android.os.Ha ...

  8. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  9. Tomcat集群如何同步会话

    Tocmat集群中最重要的交换信息就是会话消息,对某个tomcat实例某会话做的更改要同步到集群其他tomcat实例的该会话对象,这样才能保证集群所有实例的会话数据一致.在tribes组件的基础上完成 ...

  10. UNIX网络编程——使用线程的TCP回射服务器程序

    同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3)  打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...