编程VB 开发者, VB.NET 开发者

在 Visual Basic 中有哪些错误处理方式?解释 On Error GoTo 和 Try...Catch(如果是 VB.NET)的区别。

用 Hintsage AI 助手通过面试

答案。

在 Visual Basic 中,错误处理使用的结构为 On Error(VB6)和 Try...Catch(VB.NET)。

  • On Error GoTo <Label> — 是 VB6 中的过时方法,当发生错误时跳转到指定标签。不支持嵌套,可能导致代码混乱。
  • Try...Catch...Finally — 是现代方法(VB.NET),可以处理异常,允许在不同的 Catch 块中处理不同类型的错误,并且在 Finally 中执行最终操作。

示例:

VB6:

Sub OpenFile() On Error GoTo ErrorHandler Open "file.txt" For Input As #1 ' 读取文件 Close #1 Exit Sub ErrorHandler: MsgBox "错误: " & Err.Description End Sub

VB.NET:

Sub OpenFileVBNet() Try Using reader As New StreamReader("file.txt") Dim line As String = reader.ReadLine() End Using Catch ex As IOException MsgBox("错误: " & ex.Message) Finally ' 始终执行 End Try End Sub

陷阱问题。

如果在 VB6 中在 On Error Resume Next 块中发生错误,如何知道具体发生在哪里,并正确处理它?

正确答案:On Error Resume Next 模式下,程序继续执行下一行。要知道是否发生了错误,需要在调用结束后检查 Err 对象。

On Error Resume Next ' 一些代码 If Err.Number <> 0 Then MsgBox "错误: " & Err.Description Err.Clear End If

由于不懂这一主题的细节而导致的真实错误示例。


故事

从 VB6 迁移到 VB.NET 后,部分处理程序仍保留 On Error GoTo 风格,导致了错误的隐性吞噬。混淆了处理逻辑,造成数据库中的数据半空,错误直到几个月后才被发现。


故事

没有使用 Err.Clear,导致在处理一个错误后 Err.Number 保持非零。在后续检查中,程序错误地认为发生了新错误,并进入了错误的处理分支。


故事

在重构时忘记删除 On Error Resume Next,导致错误被“吞噬”,没有任何消息。问题诊断花费了几个小时,因为应用程序看起来正常工作,但实际上丢失了重要数据。