有谁遇到过这种不可思异的事情,On Error GoTo不能正确跳转
事先需要说明的是,WIN7里有很多种文件和文件夹的名字都是乱码(上网查了很多的人都遇到这样的问题),将文件名复制到记事本之类的文本框里显示的都是问号。上网查了下,可能的原因是这些字符是UNICODE字符,而不是ASCII码,所以显示不出来。
发现在我的程序里,可以用Dir函数来得到这些文件或文件夹的名字,但如果对这个文件进行打开,查看是不是文件夹等操作时,就会出现
错误代码52,“错误的文件名或数目”的提示,意思就是说找不到需要操作的文件,所以出错了。这本来没有什么奇怪的,只要设置好On
Error GoTo,转到需要处理的地方,就可以解决问题了。但奇怪的事来了,在我的一个自定义函数里,第一次出现上述的错误时,On Error
GoTo能够正确的转到需要处理的标签处,但如果第二次出现对一个有乱码字符的文件进行操作时,居然没有转到本函数的指定标签处,而是转
到了调用本函数的上级过程的错误处理标签处。
下面是详细点的说明:
有一个命令按钮1里的一个调用函数是这样的
Private Sub Command1_Click()
On Error GoTo Err:
StrDir() = DirArrEx(Text1.Text) ‘DirArrEx是自定义函数
下面是各种程序代码
Exit Sub '提前结束过程,下面的是出错时的处理代码
Err: '搞不懂下面的自定义函数DirArrEx里出错,为什么会转到这里来
然后比较各种错误
Select Case Err '根据错误号来判断
Case 1
各种处理出错时的代码
Case 2
各种处理出错时的代码
Case 52 '都有Err=52的处理啊
各种处理出错时的代码
End Select
End Sub
在下面的我的自定义DirArrEx函数里,也有一个On Error GoTo MyErr:大约代码如下:
Public Function DirArrEx(Path As String) As String()
On Error GoTo MyErr
DirName = Dir(Path, 23) ’看下这个文件夹里有什么文件或什么文件夹
Do While DirName <> ""
If (GetAttr(Path & DirName) And vbDirectory) = vbDirectory Then '看看读取的字符串是不是一个文件夹
上面的这行代码,如果出现第一次错误,会转到下面的错误处理标签MyErr:
但如果第二出出现错误,就不会转到下面的错误处理标签MyErr:,而是转到了上面的Err:
在这自定义个函数里,包括错误处理标签下的所有行,我都用了断点来追踪,但第二次出错就是直接转到上面的Err: 没有转到本函数的
任何一行,有人遇到过这种事么?知道这是什么回事么?
End if
Loop
Exit Function '提前结束函数,下面的是出错时的处理代码
MyErr:
Select Case Err '根据错误号来判断
Case 1
各种处理出错时的代码
Case 2
各种处理出错时的代码
Case 52 '都有Err=52的处理啊
各种处理出错时的代码
End Select
End Function
‘
不知道这是这是Win7的BUG,或是跟VB6有冲突,本人用VB6大约20年了,虽然水平不怎样,但对于工作需要编写的小程序都能完成,以前没有发生过这种无法理解的情况,最多是怀疑我写的代码有问题,查找到错误都能改好。最近因为安全需要,将WinXP改成了Win7,以前写的自定义函数出现很多的问题,改了很多,又出现其它问题,出现的各种问题我都能改正,或是找到由于升级原因的过期代码,改成符合Win7的要求。但就上述我所说的,不得不怀疑是不是系统原因了,而不是我的错(而Win7本身也出现了许多的小错误,网上很多都有实例)。
再次说明,不管我的代码如何写错,如何不合逻辑,在没有出现Exit Function的代码时,错误处理是不应该转移到在别的过程里的,顺便说明一下,自定义函数我是写在一个模块里,而不是写在窗口的代码框里,所以不会出现窜码的情况。
[此贴子已经被作者于2018-11-14 23:30编辑过]