Skip to content

调试技巧

🕊️ 异常处理

在 SAX Basic 中,异常处理主要通过 On Error 语句来实现,这与 VBA 的错误处理机制完全一致。以下是详细的异常处理方法和案例。

🍯 基本语法结构

vb
On Error GoTo label' 启用错误处理,跳转到指定标签
On Error Resume Next' 忽略错误,继续执行下一句
On Error GoTo 0' 禁用错误处理

🍯 异常处理模式

🍘 On Error GoTo Label(跳转模式)

最常用的错误处理方式,发生错误时跳转到指定的标签位置。

vb
Sub ErrorHandlingExample()
On Error GoTo ErrorHandler ' 启用错误处理

Dim x As Integer
Dim y As Integer
Dim result As Integer

' 可能出错的代码
x = 10
y = 0
result = x / y ' 这里会触发除零错误

MsgBox "结果是: " & result
Exit Sub ' 正常退出,避免执行错误处理代码

ErrorHandler:
' 错误处理代码
MsgBox "发生错误: " & Err.Description & vbCrLf & _
"错误号: " & Err.Number & vbCrLf & _
"错误源: " & Err.Source
' 可以选择恢复执行
Resume Next
End Sub
🍘 On Error Resume Next(继续模式)

忽略当前错误,继续执行下一行代码。

vb
Sub ResumeNextExample()
On Error Resume Next ' 忽略错误继续执行

Dim x As Integer
Dim y As Integer
Dim result As Integer

' 可能出错的代码
x = 10
y = 0
result = x / y ' 这里会触发除零错误,但会被忽略

' 检查是否发生了错误
If Err.Number <> 0 Then
MsgBox "发生错误但已忽略: " & Err.Description
Err.Clear ' 清除错误状态
Else
MsgBox "结果是: " & result
End If
End Sub

🍯 Err 对象常用属性和方法

属性/方法说明示例
Err.Number错误代码If Err.Number = 11 Then
Err.Description错误描述MsgBox Err.Description
Err.Source错误源MsgBox Err.Source
Err.Clear()清除错误状态Err.Clear
Err.Raise()主动抛出错误Err.Raise 1001, "自定义错误"

🍯 实用案例

🍘 文件操作异常处理
vb
Sub FileOperationWithErrorHandling()
On Error GoTo FileError

Dim fileNumber As Integer
fileNumber = FreeFile()

' 尝试打开文件
Open "C:\nonexistent.txt" For Input As #fileNumber

Dim content As String
Line Input #fileNumber, content
MsgBox "文件内容: " & content

Close #fileNumber
Exit Sub

FileError:
Select Case Err.Number
Case 53 ' 文件未找到
MsgBox "错误: 文件未找到,请检查路径是否正确"
Case 55 ' 文件已打开
MsgBox "错误: 文件已被其他程序打开"
Case Else
MsgBox "文件操作错误: " & Err.Description & " (错误号: " & Err.Number & ")"
End Select

' 确保文件被关闭
If fileNumber > 0 Then
Close #fileNumber
End If
End Sub
🍘 数据库操作异常处理
vb
Sub DatabaseOperationWithErrorHandling()
On Error GoTo DBError

Dim conn As Object
Set conn = CreateObject("ADODB.Connection")

' 尝试连接数据库
conn.Open "Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DatabaseName;"

' 执行SQL查询
Dim rs As Object
Set rs = conn.Execute("SELECT * FROM NonExistentTable")

MsgBox "查询成功"
Exit Sub

DBError:
MsgBox "数据库错误: " & Err.Description & vbCrLf & _
"错误号: " & Err.Number & vbCrLf & _
"建议: 请检查数据库连接字符串和表名"

' 清理资源
On Error Resume Next
If Not rs Is Nothing Then Set rs = Nothing
If Not conn Is Nothing Then
conn.Close
Set conn = Nothing
End If
End Sub
🍘 数学运算异常处理
vb
Sub MathOperationWithErrorHandling()
On Error GoTo MathError

Dim numbers(3) As Variant
numbers(0) = 10
numbers(1) = 0
numbers(2) = "abc" ' 非数字
numbers(3) = 5

Dim i As Integer
Dim result As Double

For i = LBound(numbers) To UBound(numbers)
result = 100 / numbers(i)
MsgBox "100 / " & numbers(i) & " = " & result
Next i

Exit Sub

MathError:
Select Case Err.Number
Case 11 ' 除零错误
MsgBox "数学错误: 不能除以零 (索引: " & i & ")"
Case 13 ' 类型不匹配
MsgBox "数学错误: 类型不匹配,期望数字 (索引: " & i & ", 值: " & numbers(i) & ")"
Case Else
MsgBox "数学运算错误: " & Err.Description
End Select

Err.Clear
Resume Next ' 继续下一个循环
End Sub
🍘 自定义错误抛出
vb
Sub CustomErrorExample()
On Error GoTo CustomError

Dim age As Integer
age = InputBox("请输入年龄:")

' 验证输入
If age < 0 Then
Err.Raise 1001, "CustomErrorExample", "年龄不能为负数"
ElseIf age > 150 Then
Err.Raise 1002, "CustomErrorExample", "年龄不能超过150岁"
ElseIf Not IsNumeric(age) Then
Err.Raise 1003, "CustomErrorExample", "请输入有效的数字"
End If

MsgBox "输入的年龄: " & age & " 岁"
Exit Sub

CustomError:
Select Case Err.Number
Case 1001 To 1003
MsgBox "输入验证错误: " & Err.Description
Case Else
MsgBox "未知错误: " & Err.Description
End Select
End Sub
🍘 嵌套错误处理
vb
Sub NestedErrorHandling()
On Error GoTo OuterError

' 外层操作
MsgBox "开始外层操作"

' 调用可能出错的函数
Call InnerOperation

MsgBox "外层操作完成"
Exit Sub

OuterError:
MsgBox "外层错误: " & Err.Description
Exit Sub
End Sub

Sub InnerOperation()
On Error GoTo InnerError

' 内层操作
Dim x As Integer
x = 1 / 0 ' 这里会出错

Exit Sub

InnerError:
MsgBox "内层错误: " & Err.Description
' 可以选择重新抛出错误
Err.Raise Err.Number, "InnerOperation", Err.Description
End Sub
🍘 错误处理模板
vb
Sub StandardErrorTemplate()
On Error GoTo ErrorHandler

' 主要业务代码在这里

Exit Sub ' 正常退出

ErrorHandler:
' 错误处理代码
Dim errMsg As String
errMsg = "错误号: " & Err.Number & vbCrLf & _
"描述: " & Err.Description & vbCrLf & _
"错误源: " & Err.Source

' 记录错误(可以写入文件或数据库)
' LogError errMsg

' 显示错误信息
MsgBox "发生错误:" & vbCrLf & errMsg, vbCritical, "错误"

' 清理资源
CleanupResources

' 根据错误类型决定是否继续执行
If IsRecoverableError(Err.Number) Then
Resume Next
Else
Exit Sub
End If
End Sub