VB6异常捕捉Trycatch
请看⼀个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.这种对结构化异常处理的模拟只是基本的模拟,与真正的结构化异常处理⽐起来,还是有差别的,⽐如真正的结构化异常处理是可以嵌套的,也就是说⼀个finally结构中可以嵌⼊另⼀个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
try catch的使用方法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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论