特定机器特有的奇怪错误......
我有一个应用程序,其中组合框的文本值设置为文档的路径(即...
cmbAIDFile.Text = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
忘记所有的GetSetting过程等,只是它返回一行文本并且工作正常.
这适用于除一个以外的所有机器.这个特定的Vista机器抛出错误运行时错误0并将用户抛出程序,无论程序上的ErrorHandling如何.其他Vista机器工作正常.
我们将非常感激地回答这一令人困惑的问题.
谢谢你的帮助.
该机器运行Vista Business 64位.
用户可以通过打开的用户帐户控制获得管理员权限.
根据您的提示,我尝试以管理员身份运行应用程序并获得各种奇怪的响应(丢失文件,未注册的依赖项等).已卸载该应用程序并将尝试重新安装.我认为该文件夹的卷影副本也可能令人困惑.
您可能在错误的位置查找错误.当您更改Text
的属性ComboBox
时,ComboBox
的Change
事件将触发,如果新文本是从以前的文本有所不同.这些LostFocus
和/或Validate
事件也可能会触发,具体取决于您的代码正在执行的操作以及表单的设置方式.
如果发生错误Change
事件处理(或LostFocus
和Validate
事件处理程序,如果你正在做与他们任何东西),以更改组合框的文本代码中的错误处理代码将永远不会被调用(这有多么的错误做处理和事件在VB6中工作).
作为一般规则,您应该始终在VB6代码中的每个例程(Sub,Function或Property)中放置一个错误处理程序,因为您永远无法确定是否会捕获每个错误.
这是一个快速示例,它表明错误处理可能并不总是像您在VB6中认为的那样工作.
创建一个新的标准EXE项目并将CommandButton(Command1)和ComboBox(Combo1)添加到默认窗体,并将以下代码添加到窗体:
Private Sub Combo1_Change() Dim a As Long a = 1/0 '<-- this will cause a divide-by-zero runtime error' End Sub Private Sub Command1_Click() On Error GoTo MyErrorHandler 'Change the combobox text.' 'This will cause the Change event to fire' Combo1.Text = "test" Exit Sub MyErrorHandler: 'This code will not be executed if an error occurs in Combo1_Change...' MsgBox "My error-handler called." End Sub
如果编译项目并运行生成的EXE,则只要单击Command1就会出现运行时错误,程序将终止.这是因为MyErrorHandler
未调用添加的错误处理代码(在示例中).但是,如果您将错误处理代码添加到Combo1_Change
事件处理程序,您可以捕获错误并尝试处理它(至少,您可以防止程序崩溃).
因此,我会确保每个事件过程中都有错误处理代码,如果缺少则添加它.这应该可以更容易地确定错误实际发生的位置.例如,如果您在cmbAIDFile_Change
事件过程中有代码,请确保它具有错误处理.我也会在代码中添加行号(如果你还没有它们):这样你就可以Erl
在错误处理代码中使用它来获取发生错误的实际行号.有关如何在错误消息中记录行号的示例,请参阅以下代码.
使用Erl报告错误消息中的行号
Private Sub cmbAIDFile_Change() 1000 On Error Goto ErrorHandler 1010 DoSomething 1020 DoSomethingElse ErrorHandler: 1030 Dim sErrMsg As String sErrMsg = "A fatal error occurred." & vbCrLf & vbCrLf & _ "Method: cmbAIDFile_Change" & vbCrLf & _ "Line: " & Erl & vbCrLf & _ "Err.Number: " & Err.Number & vbCrLf & _ "Err.Description: " & Err.Description 1040 MsgBox sErrMsg, vbCritical+vbOKOnly, "Fatal error" End Sub
一旦你有更细粒度的错误处理,你就可以开始研究为什么你只在一台机器上看到问题,因为你应该有更多关于正在发生的错误的可靠信息,并且要好得多找出根本原因的位置.