FreeBasic Resume 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 中的 Resume 关键字用于错误处理,允许在错误发生后继续执行。它与 On Error 结合使用,提供结构化的异常处理。本教程涵盖了在 FreeBasic 程序中使用 Resume 的所有方面。
基本定义
Resume 语句在错误发生后重定向执行。它必须在由 On Error 标记的错误处理例程中使用。FreeBasic 提供三种形式:Resume、Resume Next 和 Resume label。
使用 Resume 进行错误处理可以使程序优雅地从意外情况中恢复。这对于文件操作、内存分配和其他易出错的任务特别有用。
简单的 Resume 示例
这个基本示例展示了如何使用 Resume 重试操作。
On Error Goto ErrorHandler
Dim x As Integer = 0
Dim y As Integer = 10
Print "Result: "; y / x
Exit Sub
ErrorHandler:
Print "Error occurred: "; Err
x = 1
Resume
当发生除零错误时,执行会跳转到错误处理程序。处理程序将 x 设置为 1,并使用 Resume 重试除法。这演示了使用 Resume 进行基本的错误恢复。
Resume Next 示例
Resume Next 会在导致错误的语句之后继续执行下一条语句。
On Error Goto ErrorHandler
Dim a(5) As Integer
Dim i As Integer = 10
Print "Value: "; a(i) ' Will cause out of bounds error
Print "This line executes after Resume Next"
Exit Sub
ErrorHandler:
Print "Array access error occurred"
Resume Next
数组访问错误会触发处理程序,该处理程序使用 Resume Next 跳过错误的行。执行将继续到下一个 print 语句。当您想忽略非关键错误时,这很有用。
Resume 结合 Label 示例
Resume label 在处理错误后将控制转移到指定的标签。
On Error Goto ErrorHandler
Open "nonexistent.txt" For Input As #1
Print "File opened successfully"
Close #1
Exit Sub
ErrorHandler:
Print "File error: "; Err
Resume AfterOpen
AfterOpen:
Print "Continuing after file operation"
当文件打开失败时,错误处理程序会打印一条消息。Resume AfterOpen 跳转到带标签的部分,跳过原始的文件操作。这为错误后的程序流程提供了精确的控制。
嵌套错误处理
错误处理程序可以嵌套,内部处理程序使用 Resume 返回到外部处理程序。
On Error Goto OuterHandler
Print "Starting operation"
On Error Goto InnerHandler
Dim z As Integer = 0
Print "Result: "; 10 / z
Exit Sub
InnerHandler:
Print "Inner handler caught error: "; Err
Resume Next
OuterHandler:
Print "Outer handler caught error: "; Err
Resume AfterMath
AfterMath:
Print "Operation complete"
除零错误首先被内部处理程序捕获,它使用 Resume Next。如果内部处理程序不存在,外部处理程序将捕获它。这展示了如何创建分层的错误处理。
文件操作中的 Resume
Resume 对于健壮的文件处理特别有用。
On Error Goto FileError
Dim filename As String = "data.txt"
Dim attempts As Integer = 0
RetryOpen:
Open filename For Input As #1
Print "File opened successfully"
Close #1
Exit Sub
FileError:
attempts += 1
If attempts < 3 Then
Print "Attempt "; attempts; " failed, retrying..."
Sleep 1000
Resume RetryOpen
Else
Print "Failed after "; attempts; " attempts"
Resume GiveUp
End If
GiveUp:
Print "Using default data instead"
此示例尝试打开文件最多三次,然后放弃。Resume RetryOpen 创建一个重试循环,而 Resume GiveUp 在重试用尽时提供了一个备用路径。
Resume 结合错误清除
在恢复执行之前清除错误是一个好习惯。
On Error Goto Handler
Dim p As Integer Ptr = 0
Print "Value: "; *p ' Null pointer dereference
Exit Sub
Handler:
Print "Memory error: "; Err
Err = 0 ' Clear the error
p = Allocate(SizeOf(Integer))
*p = 42
Resume
处理空指针错误后,我们使用 Err = 0 清除错误,分配内存,然后 Resume 重试操作。这可以防止同一个错误被反复触发。
函数调用中的 Resume
Resume 可以处理在被调用的函数中发生的错误。
Function Divide(a As Integer, b As Integer) As Integer
On Error Goto MathError
Return a / b
Exit Function
MathError:
Print "Division error in function"
Resume SafeReturn
SafeReturn:
Return 0
End Function
On Error Goto MainError
Print "Result: "; Divide(10, 0)
Exit Sub
MainError:
Print "Main error handler caught: "; Err
Resume Next
该函数有自己的错误处理程序,该处理程序使用 Resume SafeReturn 提供默认值。主程序的处理程序将捕获函数中任何未处理的错误。这展示了分层错误恢复。
最佳实践
- 清除错误:在恢复之前,请始终清除
Err。 - 限制重试次数:使用计数器防止无限 Resume 循环。
- 特定处理程序:为不同的错误类型创建单独的处理程序。
- 文档记录:注释 Resume 点以提高可维护性。
- 备用路径:在无法 Resume 时提供安全的替代方案。
本教程涵盖了 FreeBasic Resume 关键字,并提供了实用的示例,展示了错误处理和恢复技术。