Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB6中处理错误的更好方法是什么_Vb6_Error Handling - Fatal编程技术网

在VB6中处理错误的更好方法是什么

在VB6中处理错误的更好方法是什么,vb6,error-handling,Vb6,Error Handling,我有一个VB6应用程序,我想在其中加入一些很好的错误处理功能,它可以告诉我错误是什么,以及发生错误的确切位置,有人能建议一个好的方法吗首先,go get,它是免费的,非常宝贵的。其次,在每个函数(是的,每个函数)上添加自定义错误处理程序。我们使用的错误处理程序如下所示: On Error GoTo {PROCEDURE_NAME}_Error {PROCEDURE_BODY} On Error GoTo 0 Exit {PROCEDURE_TYPE} {PROCEDURE_

我有一个VB6应用程序,我想在其中加入一些很好的错误处理功能,它可以告诉我错误是什么,以及发生错误的确切位置,有人能建议一个好的方法吗首先,go get,它是免费的,非常宝贵的。其次,在每个函数(是的,每个函数)上添加自定义错误处理程序。我们使用的错误处理程序如下所示:

On Error GoTo {PROCEDURE_NAME}_Error

{PROCEDURE_BODY}

    On Error GoTo 0
    Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

   LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
            ", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"
然后创建一个LogError函数,将错误记录到光盘中。接下来,在发布代码之前,为每个函数添加行号(这也内置于MZTools中)。从现在起,您将从错误日志中了解发生的一切。如果可能的话,还可以上传错误日志,并从现场实际检查它们


这是在VB6(它的许多缺陷之一)中处理意外全局错误所能做的最好的方法,实际上,这只应该用于查找意外错误。如果您知道在特定情况下可能发生错误,那么您应该捕获该特定错误并对其进行处理。如果您知道某个部分中发生的错误将导致不稳定(文件IO、内存问题等),请警告用户,并知道您处于“未知状态”,可能会发生“不好的事情”。显然,使用友好的术语来通知用户,但不要害怕。

使用On Error语句和Err对象。

On Error GOTO

Err
反对


有一个教程。

是的,接受克里斯的建议并获得MZTools

您可以将行号添加到复杂过程的分段区域,ERL将在错误处理程序中报告这些区域,以跟踪导致错误的区域

10
    ...group of statements
20
    ...group of statements
30
    ...and so on

无需额外模块的简单方法,适用于类模块:

先占每个功能/子功能:

On Error Goto Handler
处理程序/气泡器:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

瞧,贫民区堆栈跟踪。

我使用一个自产的
Error.bas
模块来减少报告和重新提升的麻烦

以下是其内容(按长度编辑):

报告错误非常简单,如下所示:

Public Sub Form_Load()
On Error Goto HError
    MsgBox 1/0
    Exit Sub
HError:
    Error.ReportFrom Me, "Form_Load"
End Sub
重新调用错误与调用
error一样简单。使用新源重新调用

虽然如果使用符号调试信息进行编译,则可以从调用堆栈中检索
过程
参数,但其可靠性不足以在生产应用程序中使用

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"

我还将两个单独的“error”和“handling”标记改为“error handling”Kris——我希望我能给你两张赞成票。回答得很好!为什么要在退出之前将On错误添加到0?我的理解是,当退出(Function | Sub)发生时,当前的错误处理程序会自动失去作用域。此外,假设原始海报按照您所说的那样执行,任何调用例程都将忽略发生错误的事实,并将继续处理。如何从错误中恢复?错误转到0是不必要的(我认为这是VB5的代码优化,但我不记得了),它只是锅炉板代码的一部分。正如我在回答中所说,这只是为了处理意外错误。您应该为可能出现的任何错误编写代码。+1,但我还建议将错误返回给错误处理程序中的调用方。否则,调用方将继续进行,而不知道例程没有工作,可能会导致更严重的问题。事件处理程序显然不应该抛出,否则它们会使应用程序崩溃。这主意不错,但在您的示例表单加载例程中,您应该将Exit Sub置于“HError:”之上。很好的捕获MarkJ!为了完整性,我补充说,正如我在这个问题的另一个化身中指出的:我看到了一个很大的缺点。现在,如果我这样做,所有运行时错误都会得到处理。调试器不会在错误位置停止应用程序。相反,它将在堆栈中的其他过程的错误处理程序中停止。因此,此方法有助于I-have-no-debugger-in-production-environment场景,但会中断VB6 IDE的正常工作。对于IDE中的调试,应始终将其设置为在所有错误时中断(当然,假定正常程序流不会生成错误)+1好主意。你可以用免费的MZTools自动添加这个样板文件请描述你的答案有时候你有一个想跳过的错误,但是如果你在下一步的错误恢复中做了,你甚至不知道有错误,我喜欢使用它的原因是它继续,但它告诉你有一个错误error@symbiont谢谢我现在已经用另一个代替了它,但是VB6链接可能会因为它的年龄越来越少。谢谢。是的,你当然是对的。不幸的是,我有时不得不将其用于工作(我希望它很快就消失了哈哈)在访问链接时收到一条“网站离线(由于技术原因)”消息。@Claum谢谢,这似乎是暂时的,但如果它没有回来,我会尝试更新答案。
dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"