调试技巧
🕊️ 异常处理
在 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