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
关键字,展示了各种错误处理技术。正确的错误处理可以使程序更加健壮和用户友好。