| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3747 人关注过本帖
标题:有谁遇到过这种不可思异的事情,On Error GoTo不能正确跳转
只看楼主 加入收藏
tempwc
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2018-11-14
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:7 
有谁遇到过这种不可思异的事情,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编辑过]

搜索更多相关主题的帖子: 函数 错误 代码 出错 处理 
2018-11-14 23:08
HVB6
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:331
专家分:561
注 册:2013-10-30
收藏
得分:0 
回复 楼主 tempwc
.......
MyErr:
  Select Case Err  '根据错误号来判断
    Case 1
    各种处理出错时的代码
    Case 2
    各种处理出错时的代码
    Case 52   '都有Err=52的处理啊
    各种处理出错时的代码
  End  Select
Err.Clear  '试试
End  Function
2018-11-15 07:43
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:15 
以下是引用tempwc在2018-11-14 23:08:06的发言:
 
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  
第一次出错能够跳转到MyErr,而第二次错误陷阱完全不起作用,说明是你第一次错误处理过程处理完成后,返回正常代码时用的代码是Goto而不是Resume,导致你的程序一直在错误处理过程中。当程序处于错误处理过程时发生错误,On Error GoTo是不起作用的!
程序代码:
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        '看看读取的字符串是不是一个文件夹
      '....
    End if
ErrorEndLoop:    '假设你处理过程处理好后要跳转回这里。
  Loop
ExitFunction:
Exit Function '提前结束函数,下面的是出错时的处理代码

MyErr:
  Select Case Err  '根据错误号来判断
    Case 1
    各种处理出错时的代码
     Resume ErrorEndLoop    
    Case 2
    各种处理出错时的代码
     Resume ErrorEndLoop
    Case 52   '都有Err=52的处理啊
    各种处理出错时的代码
       
  End  Select 
   Resume ExitFunction
End  Function


VB QQ群:47715789
2018-11-15 08:11
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:5 
并不是在代码中用了错误陷井就可以忽视可能的错误,一定要记住:在错误陷井处理过程中,一定要保证你的错误处理代码不会发生任何错误。而当错误处理过程业务处理完成之后,如果要再次进入日常业务代码段运行,一次要使用Resum跳转,表示处理过程已经完成,让系统再次允许激活错误陷井。

VB QQ群:47715789
2018-11-15 08:19
yingshu
Rank: 4
等 级:贵宾
威 望:10
帖 子:49
专家分:212
注 册:2018-7-24
收藏
得分:0 
换个思路,遍历文件夹下含有哪些文件和文件夹,使用Folder对象,比代码简单多了
跳来跳去的,跟不上节拍
2018-11-15 09:42
tempwc
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2018-11-14
收藏
得分:0 
回复 2楼 HVB6
    谢谢你的回复,但不是你说的原因,因为我的错误处理里面的代码里有这一条代码
      Err.Clear     
     才是转到下一个DirName = Dir
重新读取当前文件夹的下一个文件名的代码里,而重新读取的命令可以正常的读取新的文件名,只不过到了下一个文件名如果有乱码,就会跳转到另外过程的错误处理里,我将所有的代码都用了断点来追踪的。
2018-11-15 20:34
tempwc
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2018-11-14
收藏
得分:0 
    谢谢各位的支持,问题解决了。我原来在处理完出错后用的转移命令是“Goto 某行号” ,改成“Resume 某行号” 后,没有发生错误了。我是太武断的认为是系统问题,现在才知道是我的水平问题。当初是为了工作需要,自学的VB6,没有人教,也只是买了两本书来看,有的东西还吃不透,VB6的帮助文件又讲得不够细,加上我的理解又有问题,所以有的东西还不会用。再次谢谢所有人的回复,谢谢大家。
2018-11-15 21:07
tempwc
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2018-11-14
收藏
得分:0 
不好意思,第一次发贴,问题解决了,居然忘记了结帐。刚才结了,请答对的两位朋友不要介意啊。
2018-11-16 20:52
快速回复:有谁遇到过这种不可思异的事情,On Error GoTo不能正确跳转
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024527 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved