ZetCode

FreeBasic On Error 关键字

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

FreeBasic 的 On Error 关键字支持结构化程序错误处理。它允许开发人员优雅地处理运行时错误,而不是让程序意外崩溃。

基本定义

在 FreeBasic 中,On Error 会建立一个错误处理例程。当发生错误时,程序执行将跳转到指定的错误处理程序。这提供了对程序如何响应意外情况的控制。

On Error 语句有几种形式:On Error GotoOn Error Resume NextOn Error Goto 0。每种形式在错误管理中都有不同的用途。

使用 On Error Goto 进行基本错误处理

此示例演示了使用 On Error Goto 的基本错误处理。我们使用一个尝试打开不存在文件的文件操作——这会可靠地触发一个错误。

on_error_basic.bas
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 在发生错误后继续执行。

on_error_resume.bas
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 如何允许程序在不终止的情况下优雅地处理错误。

嵌套的错误处理程序

错误处理程序可以嵌套,以便分别处理不同类型的错误。

on_error_nested.bas
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 会关闭当前范围内的错误处理。

on_error_disable.bas
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 后,任何错误都会导致程序终止,而不是被处理程序捕获。当您想确保某些代码段在没有错误保护的情况下运行,此功能非常有用。

函数中的错误处理

函数可以使用错误处理来验证参数或操作。

on_error_function.bas
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 变量来获取错误号。

on_error_details.bas
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 语句允许进行复杂的错误恢复。

on_error_resume.bas
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 会在指定的标签处继续执行。

最佳实践

本教程通过实用的示例介绍了 FreeBasic 的 On Error 关键字,展示了各种错误处理技术。正确的错误处理可以使程序更加健壮和用户友好。

作者

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

列出所有 FreeBasic 教程