VB.NET版机房收费系统---异常处理

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")