ZetCode

FreeBasic Resume Next 关键字

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

FreeBasic 的 Resume Next 语句用于错误处理,以便在导致错误的行之后立即继续执行。它与 On Error 语句配合使用,以控制错误发生时的程序流。

基本定义

Resume Next 是 FreeBasic 错误处理机制的一部分。当发生错误时,程序将继续执行下一行,而不是终止程序。

当您想忽略某些错误或错误对程序执行来说不是关键性错误时,这种方法非常有用。它允许程序在遇到问题时继续运行。

简单的 Resume Next 示例

这个基础示例展示了如何使用 Resume Next 来处理除以零的错误。

resume_next_simple.bas
On Error Resume Next

Dim a As Integer = 10
Dim b As Integer = 0
Dim result As Integer = a / b

If Err Then
    Print "Error occurred: "; Err
    Print "Error description: "; Error(Err)
Else
    Print "Result: "; result
End If

在这里,我们尝试除以零,这通常会导致程序崩溃。使用 Resume Next,执行会继续,我们可以检查 Err 变量以查看是否发生了错误。错误被捕获并得到妥善处理。

处理文件操作

Resume Next 在处理可能失败的文件操作时特别有用。

resume_next_file.bas
On Error Resume Next

Open "nonexistent.txt" For Input As #1

If Err Then
    Print "Could not open file: "; Error(Err)
Else
    Print "File opened successfully"
    Close #1
End If

此代码尝试打开一个不存在的文件。错误被捕获并显示适当的消息,而不是导致程序崩溃。这使得程序在处理外部资源时更加健壮。

带错误检查的多个操作

您可以执行多个操作,并在每个操作后检查错误。

resume_next_multiple.bas
On Error Resume Next

Dim values(5) As Integer
values(10) = 42  ' Out of bounds

If Err Then
    Print "Array error: "; Error(Err)
    Err = 0  ' Clear error
End If

Dim x As Integer = 100 / 0

If Err Then
    Print "Math error: "; Error(Err)
    Err = 0
End If

此示例演示了如何处理多个潜在的错误源。在每次操作后,我们都会检查错误并在继续之前清除错误标志。这使得程序能够忽略多个错误并继续执行。

嵌套错误处理

您可以使用不同的 On Error 语句嵌套错误处理块。

resume_next_nested.bas
On Error Resume Next

Print "Starting outer block"

Dim a As Integer = 10 / 0  ' Will be caught by outer handler

If Err Then
    Print "Outer error: "; Error(Err)
    Err = 0
    
    On Error Goto 0  ' Disable error handling temporarily
    
    Print "Starting inner block"
    Dim b As Integer = 20 / 0  ' Will crash here
    
    On Error Resume Next  ' Re-enable error handling
End If

Print "Program continues"

这展示了如何在块内暂时禁用错误处理。第一个错误被捕获,然后我们禁用处理,让第二个错误导致程序崩溃。这种技术对于调试非常有用。

函数中的错误处理

函数可以使用 Resume Next 在内部处理错误。

resume_next_function.bas
Function SafeDivide(a As Integer, b As Integer) As Integer
    On Error Resume Next
    SafeDivide = a / b
    If Err Then SafeDivide = 0
End Function

Print "10 / 2 = "; SafeDivide(10, 2)
Print "10 / 0 = "; SafeDivide(10, 0)

SafeDivide 函数在内部处理除法错误。如果除法失败,它会返回 0 而不是崩溃。这使得该函数在处理潜在的无效输入时更加健壮。

与其他错误处理程序结合使用

Resume Next 可以与其他错误处理技术结合使用,以获得更强的控制力。

resume_next_combined.bas
Sub CriticalOperation()
    On Error Goto ErrorHandler
    
    Dim x As Integer = 100 / 0
    Print "Operation succeeded"
    Exit Sub
    
ErrorHandler:
    Print "Critical error: "; Error(Err)
    End
End Sub

On Error Resume Next

Print "Starting non-critical operations"
Dim y As Integer = 100 / 0  ' Will be ignored
Print "Continuing after error"

CriticalOperation()

此示例展示了不同的错误处理方法。非关键操作使用 Resume Next,而关键操作使用专用错误处理程序。这提供了错误管理的灵活性。

使用 Resume Next 进行错误日志记录

您可以使用 Resume Next 在继续执行的同时记录错误。

resume_next_logging.bas
Sub LogError(errNum As Integer)
    Open "errors.log" For Append As #1
    Print #1, "Error "; errNum; ": "; Error(errNum); " at "; Time
    Close #1
End Sub

On Error Resume Next

Dim values(5) As Integer
values(10) = 42  ' Out of bounds
If Err Then LogError(Err): Err = 0

Dim f As Double = Sqr(-1)  ' Invalid argument
If Err Then LogError(Err): Err = 0

Print "Program completed (check errors.log for details)"

此代码将错误记录到文件中,同时允许程序继续运行。每个错误都带有时间戳进行记录,提供审计跟踪,同时保持程序执行。这对于长期运行的程序很有用。

最佳实践

本教程通过各种场景下的实际示例,涵盖了 FreeBasic 的 Resume Next 关键字及其用法。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 FreeBasic 教程