FreeBasic On Error 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 On Error 关键字支持结构化程序错误处理。它允许开发人员优雅地处理运行时错误,而不是让程序意外崩溃。
基本定义
在 FreeBasic 中,On Error 会建立一个错误处理例程。当发生错误时,程序执行将跳转到指定的错误处理程序。这提供了对程序如何响应意外情况的控制。
On Error 语句有几种形式:On Error Goto、On Error Resume Next 和 On Error Goto 0。每种形式在错误管理中都有不同的用途。
使用 On Error Goto 进行基本错误处理
此示例演示了使用 On Error Goto 的基本错误处理。我们使用一个尝试打开不存在文件的文件操作——这会可靠地触发一个错误。
Sub Main()
On Error Goto ErrorHandler
Dim x As Integer = 10
Dim y As Integer = 0
Dim result As Integer = x \ y ' Integer division by zero
Print "Result: "; result
Exit Sub
ErrorHandler:
Print "Error occurred: "; Err
Resume Next
End Sub
Main()
在此示例中,我们尝试将整数除以零,这会触发错误处理程序。错误处理程序会打印错误号并使用 Resume Next 继续执行。请注意,FreeBasic 的 On Error 主要捕获运行时错误,例如除以零、数组边界违规以及类似的数学或内存错误。
使用 On Error Resume Next 恢复执行
On Error Resume Next 在发生错误后继续执行。
Sub Main()
On Error Resume Next
Dim values(5) As Integer = {10, 20, 0, 5, 0, 15}
Dim result As Integer
For i As Integer = 0 To 5
result = 100 \ values(i) ' Integer division
If Err Then
Print "Division by zero at index "; i
Err = 0 ' Clear the error
Else
Print "100 / "; values(i); " = "; result
End If
Next
End Sub
Main()
此代码尝试用每个数组元素除以 100。当遇到零时,它会继续到下一个迭代而不是停止。Err 检查确定是否发生了错误,而 Err = 0 则清除它。这演示了 On Error Resume Next 如何允许程序在不终止的情况下优雅地处理错误。
嵌套的错误处理程序
错误处理程序可以嵌套,以便分别处理不同类型的错误。
Sub ProcessArray()
On Error Goto ArrayError
Dim arr(5) As Integer = {1, 2, 0, 4, 5}
For i As Integer = 0 To 5
On Error Goto DivisionError
Dim result As Integer = 100 \ arr(i)
Print "100 / "; arr(i); " = "; result
Next
Exit Sub
ArrayError:
Print "Array access error: "; Err
Exit Sub
DivisionError:
Print "Division error at index "; i; ": "; Err
Resume Next
End Sub
ProcessArray()
此示例显示了嵌套错误处理。外部处理程序捕获数组访问错误,而内部处理程序捕获除以零错误。每种错误类型都有特定的处理方式,同时保持程序流程。
使用 On Error Goto 0 禁用错误处理
On Error Goto 0 会关闭当前范围内的错误处理。
Sub Main()
On Error Goto Handler
Print "Before error handling disabled"
On Error Goto 0
Dim x As Integer = 10 \ 0 ' This will crash the program
Print "This line won't execute"
Exit Sub
Handler:
Print "Error caught: "; Err
Resume Next
End Sub
Main()
在执行 On Error Goto 0 后,任何错误都会导致程序终止,而不是被处理程序捕获。当您想确保某些代码段在没有错误保护的情况下运行,此功能非常有用。
函数中的错误处理
函数可以使用错误处理来验证参数或操作。
Function SafeDivide(numerator As Integer, denominator As Integer) As Double
On Error Goto DivError
Return numerator / denominator
Exit Function
DivError:
Print "Division error - returning 0"
Return 0
End Function
Print "10 / 2 = "; SafeDivide(10, 2)
Print "10 / 0 = "; SafeDivide(10, 0)
此函数通过在除法失败时返回 0 来安全地处理除法。错误处理程序可防止程序崩溃,同时提供合理的默认值。调用代码无需实现自己的错误检查。
使用 Err 函数
FreeBasic 提供了 Err 变量来获取错误号。
Sub Main()
On Error Goto ErrorHandler
' Trigger different errors
Dim x As Integer = 10 \ 0 ' Division by zero
'Dim arr(5) As Integer : arr(10) = 1 ' Array bounds
Exit Sub
ErrorHandler:
Print "Error number: "; Err
Select Case Err
Case 11:
Print "Division by zero error"
Case 9:
Print "Array subscript out of range"
Case Else:
Print "Unknown error"
End Select
Resume Next
End Sub
Main()
此代码演示了如何访问错误信息。Err 包含错误号。不同的错误号对应不同类型的运行时错误。您可以使用 Select Case 来分别处理特定类型的错误。
使用 Resume 进行高级错误处理
Resume 语句允许进行复杂的错误恢复。
Sub ProcessData()
On Error Goto DataError
Dim attempts As Integer = 0
RetryPoint:
attempts += 1
' Simulate unreliable operation
If attempts < 3 And Int(Rnd() * 10) < 7 Then
Print "Operation failed (attempt "; attempts; ")"
Dim x As Integer = 10 \ 0 ' Trigger error
End If
Print "Operation succeeded after "; attempts; " attempts"
Exit Sub
DataError:
Print "Error occurred (attempt "; attempts; ")"
If attempts < 3 Then
Sleep 1000 ' Wait before retry
Resume RetryPoint
Else
Print "Giving up after 3 attempts"
End If
End Sub
Randomize Timer
ProcessData()
此示例使用 Resume 实现重试逻辑。操作在前两次尝试中有 70% 的失败几率。错误处理程序最多重试三次,然后放弃。Resume 会在指定的标签处继续执行。
最佳实践
- 特定处理程序:为不同类型的错误创建单独的处理程序。
- 资源清理:始终在错误处理程序中释放资源。
- 错误信息:记录详细的错误信息以进行调试。
- 有限范围:当不需要保护时,使用
On Error Goto 0。 - 恢复:仅在错误可以纠正时才使用
Resume。
本教程通过实用的示例介绍了 FreeBasic 的 On Error 关键字,展示了各种错误处理技术。正确的错误处理可以使程序更加健壮和用户友好。