我有以下代码
Private Sub Command1_Click()
Dim vValidar As Integer
If (MsgBox("Desea Generar el Arqueo?", vbYesNo + vbQuestion) = vbNo) Then Exit Sub
frmEspere.Show
If err.Number Then MsgBox ("Error code = " & err.Number & " Description: " & err.Description)
On Error GoTo err
vValidar = 0在我接受msgbox (它转到err:)之后,它就会停止执行。当我检查err.number时,它的值是0。err.descritpion什么也不回。如果失败了,我能明白为什么吗?
发布于 2021-12-14 00:40:53
显然,您没有正确编译这段代码,而且它正在动态地解释它。使用VB6时,始终完全编译代码(CTL-F5)。因此,VB6没有意识到err标签在您真正尝试GoTo之前并不存在。所有这些代码都没有意义。在调用frmEspere.Show之前,您没有提供任何错误处理程序,但是在调用该方法之后将读取错误号。如果frmEspere.Show引发错误,您的程序将立即崩溃,因此它永远不会到达下一行。我建议您阅读Visual中的错误处理主题。但是,为了让您有一个开始,有两种使用错误处理的风格,您可以使代码工作。
首先,有“跳转到错误处理程序”的样式:
Private Sub Command1_Click()
Dim vValidar As Integer
On Error GoTo ErrorHandler
If (MsgBox("Desea Generar el Arqueo?", vbYesNo Or vbQuestion) = vbNo) Then Exit Sub
frmEspere.Show
Exit Sub
ErrorHandler:
MsgBox "Error code = " & err.Number & " Description: " & err.Description
End Sub还有“内联错误处理程序”样式:
Private Sub Command1_Click()
Dim vValidar As Integer
On Error Resume Next
If (MsgBox("Desea Generar el Arqueo?", vbYesNo Or vbQuestion) = vbNo) Then Exit Sub
frmEspere.Show
If Err.Number <> 0 Then MsgBox "Error code = " & Err.Number & " Description: " & err.Description
End Sub这两种样式都将所有错误看作是从您调用的语句或方法中隐藏的返回值(在调用ActiveX组件时,这些错误正是正在发生的)。错误发生后,您所调用的语句将先发制人地终止,Err对象中填充了Number、Description和Source属性。
我个人的喜好是以前的风格。本质上,您是在编写异常处理程序--错误通常不应作为应用程序正常功能的一部分发生。当您跳转到错误处理程序时,您可以使用Number属性来决定下一步要做什么。如果使用这种样式,则有三个选项:
value).
Resume
Err.Raise来重新定义当前的错误,或者引发不同的错误。)
在使用这种样式时,您应该确保主代码在错误处理程序标签之前调用Exit Sub。
使用后一种样式,您不会跳转到错误处理程序,而只是在引发错误的语句之后的语句。如果您愿意,可以忽略错误(我不会),但与前一种样式一样,您可以:
Err.Raise来重新定义当前的错误,或者引发不同的错误。)
我干掉了vValidar = 0,因为它毫无意义。我将vbYesNo + vbQuestion更改为vbYesNo Or vbQuestion,因为该参数表示一系列应该是或应该放在一起的标志。你可能看到的每一个例子,包括微软自己的例子都是误导的。
https://stackoverflow.com/questions/70339263
复制相似问题