VB6 异常捕捉 Try catch

请看一个VB.NET结构化异常处理的例子。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Long, j As Long
        j = 0
        Try
            i = 1 / j
        Catch
            MsgBox("ERROR")
        Finally
            MsgBox("Finally")
        End Try
    End Sub

当然,在实际编程中我们不会做仅仅弹出一个msgbox这么无聊的动作。Try 结构中
我们通常放一些可能引发异常的代码,这类的代码大多是访问文件(因为读写文件可能遇到被拒、磁盘满等情况)、访问注册表 等不可靠操作。当try结构中的代码执行出现异常时,程序直接跳转,执行catch结构中的代码,catch结构中,我们通常是放一些报告错误、处理错误的代码,比如用 Msgbox 报告给用户出了什么错,下一步用户该如何做等等信息。不论 是否发生异常,Finally结构中的代码是总是要执行的,因此我们可以在finally结构中放进去一些被称作“清理性代码”的语句,比如,关闭打开的文件、关闭打开的句炳、释放对象的实例等操作。

VB6是基于COM的开发语言,和c++中的栈上创建对象有很大的不同。VB6中的COM对象具有引用计数机制,这就意味着,在一个例程结束后,对象变量(指向对象实例的指针)会被自动销毁,那么对象实例的引用计数器的数值就会减一,如果计数器减到0,这个实例就会被系统自动销毁。而C++的栈上创建的对象则没有这种自我管理机制,它需要程序员显式的释放对象实例。(关于COM的原理,先说到这,以后专门详谈)。总之,对VB6来说,用结构化异常来保证对象实例的销毁并不是显得那么有用,但我们有足够的理由在VB6中使用结构化异常处理,显而易见,前面提到的那些情况:关闭打开的文件、关闭打开的各种句炳,这些都是使用结构化异常处理的理由。

VB6虽然没有直接提供结构化异常处理机制,但其实只要把 On Error 语句稍做变通就可以了。

请看VB6模拟出的结构化异常处理:
try: On Error GoTo catch
'{
     
     在这里添加“不可靠代码”

'}
GoTo finally
catch:
'{
      
     在这里添加“错误报告、错误处理代码”     

'}
finally:
'{

     在这里添加“清理性代码,比如:关闭文件、关闭句炳等”

'}

也许您可能持反对意见,告诉我这段代码用了 goto 语句,这是不好的编程风格。
不提倡用goto 是因为 滥用goto 会把代码变成“乱面条”,但很明显这段代码并没有
滥用goto ,而是非常谨慎了的用了一下 goto ,代码中的goto 全部整齐划一的指向
finally 语句。

如果您有“goto 洁癖”,那么只好试试这个了:
try: On Error GoTo catch
'{
     
     在这里添加“不可靠代码”

'}
finally:
'{

     在这里添加“清理性代码,比如:关闭文件、关闭句炳等”

Exit Sub
'}

catch:
'{

     在这里添加“错误报告、错误处理代码”    

Resume finally
'}
这种格式和前者是等效的,它没用goto,但我觉得它比前者更“面条”一些。^_^个人喜欢第一种。

后记:
1.注意:finally 中一定要放稳固的代码,如果finally中出了错,就会导致异常无法处理。
2.这种对结构化异常处理的模拟只是基本的模拟,与真正的结构化异常处理比起来,还是有差别的,比如真正的结构化异常处理是可以嵌套的,也就是说一个try..catch...finally结构中可以嵌入另一个try...catch...finally结构。

注意runtime errors 须将 On Error Goto 改为 On Error Resume Next 才能捕捉到错误。并做如下改动

调用方法 

Try
        conn.Open ConStr         '可能出错的行[A]
 endTry

 

sub try
    On Error Resume Next
end sub

sub endTry
    if Err.Number = 0 then
        Catch
    else
        OK
    end if
    finally
end sub

 

    sub catch
     '这里对Err.Number进行判断,然后做相应处理

      If Err.Number = XX then ....
        On Error GoTo 0
    end sub


    sub OK
        '这里是如果不出错应该继续执行的东西 
        On Error GoTo 0
    end sub

    sub finally
        '这里是不论是否出错都可以执行的地方
    end sub

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VB.Net常用语法 一:Try………Catch………finally………end try 捕获错误 把一个可能出错的语句放在try后面,如果出错,执行catch语句, catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句 所捕获。在所有的处理结束后,执行finally语句。 在一个try………end try 过程中可以使用catch与finally两个中的一 个,或者两个一起用, 二:Protected, private, Public 封装控制 这三个关键字一般放在语句最前面,而会置于overloads与Overrides的 后面 public是工程级别外部访问 protected是本族级别以下内部访问 private是不提供非本地访问 三:ByVal sender As Object, ByVal e As System.EventArgs   这是最赏用事件传递参数。被封装于两个对象内, 如果你要传递相应的参数,要在这两个对象里面找,如当前鼠标位置为 e.X e.Y。在VB.Net中有些事件是要自已动手写的, 如窗体鼠标过程,一般加上这个参数在后面的括号内就解决了。 四:重载语法Overloads 如:class class1 public strtem as string overloads public sub subx()重载subx(A状态) strtem=”3” end sub overloads public sub subx(x as string) 重载subx(B状 态) strtem=x end sub end class 如果你如果调用subx()中间没有参数,则VB自动调用重载subx(A状 态), overloads public sub subx()重载subx(A状态) strtem=”3” end sub 结果就是strtem=”3” 如果你这样调用,subx(“这是一个不同的结果”),则VB自动调用重 载subx(B状态) overloads public sub subx(x as string) 重载subx(B状 态) strtem=x end sub 结果就是 strtem=“这是一个不同的结果” 您可以在函数中调用,包括在API中(当然VB.Net不再使用winAPI). 甚至一些至关紧要的过程也不例外:如new过程(此方法王国荣文章中 有介绍) 如: class class1 Overloads Public Sub New() 。。。。。。 。。。。。。 end sub Overloads Public Sub New(s as string) 。。。。。。 。。。。。。 end sub end class 同样有两种调用的方法,如dim as as class1=new class 调用前面 一个无参数的new过程, 而dim asb as class1=new class(“string”)调用第二个new 过程. 切记,如果一个过程或一个函数只有一种状态,不能这样运用。如果您试 图使用overloads关键字,则VB.Net会出现错误的提示要求你移去 overloads 五:Overrides改写 如常见的dispose过程: Overrides Public Sub Dispose() MyBase.Dispose components.Dispose End Sub Overrides表示完全的改写父类提供的过程与函数 不过要记住使用改写的前提是在父类的同一过程或函数的前面也使用了 overrides关键字 六:mybase.new 与mybase.dispose ublic Sub New() MyBase.New Form1 = Me InitializeComponent End Sub Overrides Public Sub Dispose() ' MyBase.Dispose components.Dispose End Sub 这两个过程是任何一个新建工程都会有的,mybase.new是调用当前类的 父类的new过程,同样你也可以加上参数配合父类的重载New过程。如: Overloads Public Sub New () MyBase.New() End Sub Overloads Public Sub New (string) MyBase.New(string) End Sub 七:Structure构造 自定义类型,如: Structure Type1 Dim x as y Dim a as b 。。。。。。。 end structure 这个取代VB6中的使用type………end type方式自定义类型的方法。 八:return返回值 function functionname() return X。。。。。。 end funtion 他的作用与下面一样: function functionname() functionname = X。。。。。。 end funtion

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值