ZetCode

FreeBasic Resume 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 中的 Resume 关键字用于错误处理,允许在错误发生后继续执行。它与 On Error 结合使用,提供结构化的异常处理。本教程涵盖了在 FreeBasic 程序中使用 Resume 的所有方面。

基本定义

Resume 语句在错误发生后重定向执行。它必须在由 On Error 标记的错误处理例程中使用。FreeBasic 提供三种形式:ResumeResume NextResume label

使用 Resume 进行错误处理可以使程序优雅地从意外情况中恢复。这对于文件操作、内存分配和其他易出错的任务特别有用。

简单的 Resume 示例

这个基本示例展示了如何使用 Resume 重试操作。

resume_simple.bas
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 会在导致错误的语句之后继续执行下一条语句。

resume_next.bas
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 在处理错误后将控制转移到指定的标签。

resume_label.bas
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 返回到外部处理程序。

resume_nested.bas
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 对于健壮的文件处理特别有用。

resume_file.bas
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 结合错误清除

在恢复执行之前清除错误是一个好习惯。

resume_clear.bas
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 可以处理在被调用的函数中发生的错误。

resume_function.bas
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 提供默认值。主程序的处理程序将捕获函数中任何未处理的错误。这展示了分层错误恢复。

最佳实践

本教程涵盖了 FreeBasic Resume 关键字,并提供了实用的示例,展示了错误处理和恢复技术。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 FreeBasic 教程