ZetCode

FreeBasic Error 关键字

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

FreeBasic 中的 Error 关键字用于错误处理和异常管理。它允许程序优雅地处理运行时错误和意外情况。

基本定义

在 FreeBasic 中,Error 用于引发自定义错误或处理运行时异常。它与 On Error 语句一起使用,以创建健壮的错误处理例程。

错误处理机制有助于防止程序崩溃,并允许从异常情况中进行受控恢复。FreeBasic 提供内置和用户定义的错误代码。

简单的错误处理

此示例演示了使用 On Error 的基本错误处理。

error_basic.bas
On Error Goto ErrorHandler

Dim x As Integer = 10
Dim y As Integer = 0

Print "Result: "; x / y  ' This will cause division by zero error
Exit Sub

ErrorHandler:
Print "Error occurred: "; Err
Print "Error description: "; Error$(Err)
Resume Next

在这里,我们设置了一个错误处理程序,在发生错误时跳转到 ErrorHandler 标签。除以零会触发该处理程序,该处理程序在继续之前会打印错误代码和描述。

引发自定义错误

您可以使用 Error 关键字引发自定义错误。

error_custom.bas
Sub ProcessValue(n As Integer)
    If n < 0 Then
        Error 1000  ' Raise custom error
    End If
    Print "Processing value: "; n
End Sub

On Error Goto Handler

ProcessValue(10)
ProcessValue(-5)  ' This will trigger our custom error
Exit Sub

Handler:
Print "Custom error caught: "; Err
If Err = 1000 Then
    Print "Negative values not allowed"
End If
Resume Next

此代码为负输入值定义了一个自定义错误 (1000)。当发生错误时,控制权会转移到处理程序,该处理程序为我们的自定义错误代码提供了特定的消息。

Error Resume Next

Resume Next 语句会在错误后继续执行。

error_resume.bas
On Error Resume Next

Dim a(5) As Integer
a(10) = 42  ' This would normally cause an out-of-bounds error

If Err Then
    Print "Array access error occurred"
    Err = 0  ' Clear the error
End If

Print "Program continues normally"

On Error Resume Next 会抑制正常错误处理并继续执行。我们手动检查 Err 来检测是否发生了错误。此方法对于非关键操作很有用。

嵌套错误处理程序

FreeBasic 允许嵌套错误处理程序以处理更复杂的场景。

error_nested.bas
Sub InnerSub()
    On Error Goto InnerHandler
    Error 200  ' Simulate an error
    Exit Sub
    
InnerHandler:
    Print "Inner handler caught error: "; Err
    Resume Next
End Sub

On Error Goto OuterHandler

Print "Calling InnerSub"
InnerSub()
Print "Back from InnerSub"
Exit Sub

OuterHandler:
Print "Outer handler caught error: "; Err
Resume Next

此示例显示了嵌套错误处理。内部处理程序会捕获并处理其错误,因此外部处理程序永远不会看到它。每个子程序都可以有自己的错误处理逻辑。

Error 对象

FreeBasic 提供 Err 对象来获取错误信息。

error_object.bas
On Error Goto Handler

Open "nonexistent.txt" For Input As #1  ' This will fail
Exit Sub

Handler:
Print "Error number: "; Err
Print "Error description: "; Error$(Err)
Print "Error line: "; Erl
Resume Next

Err 对象包含错误编号,而 Error$ 提供描述。Erl 提供发生错误的行号,有助于调试。

函数中的错误处理

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

error_function.bas
Function SafeDivide(a As Integer, b As Integer) As Double
    On Error Goto DivError
    Return a / b
    Exit Function
    
DivError:
    Print "Division error in SafeDivide"
    Return 0
End Function

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

此函数实现了自己的除法运算错误处理。当发生除以零时,它会捕获错误并返回 0 而不是崩溃。调用代码保持简洁明了。

禁用错误处理

您可以使用 On Error Goto 0 禁用错误处理。

error_disable.bas
On Error Goto Handler

Print "Before critical section"
On Error Goto 0  ' Disable error handling

' Critical section where we want immediate failure on errors
Dim p As Integer Ptr = 0
*p = 42  ' This will crash immediately

Print "This won't be printed"
Exit Sub

Handler:
Print "This handler won't be reached for the critical error"
Resume Next

此代码显示了如何临时禁用错误处理。在关键部分,立即失败可能比错误恢复更可取。空指针赋值按预期使程序崩溃。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 Error 关键字,展示了其在不同场景下的用法。

作者

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

列出所有 FreeBasic 教程