FreeBasic Error 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 中的 Error 关键字用于错误处理和异常管理。它允许程序优雅地处理运行时错误和意外情况。
基本定义
在 FreeBasic 中,Error 用于引发自定义错误或处理运行时异常。它与 On Error 语句一起使用,以创建健壮的错误处理例程。
错误处理机制有助于防止程序崩溃,并允许从异常情况中进行受控恢复。FreeBasic 提供内置和用户定义的错误代码。
简单的错误处理
此示例演示了使用 On Error 的基本错误处理。
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 关键字引发自定义错误。
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 语句会在错误后继续执行。
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 允许嵌套错误处理程序以处理更复杂的场景。
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 对象来获取错误信息。
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 提供发生错误的行号,有助于调试。
函数中的错误处理
函数可以使用错误处理来验证参数或操作。
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 禁用错误处理。
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
此代码显示了如何临时禁用错误处理。在关键部分,立即失败可能比错误恢复更可取。空指针赋值按预期使程序崩溃。
最佳实践
- 特定处理程序: 为不同类型的错误创建单独的处理程序。
- 错误代码: 使用有意义的自定义错误代码(1000 以上)。
- 清理: 在错误处理程序中始终包含清理代码。
- 文档: 记录所有自定义错误代码及其含义。
- 测试: 彻底测试错误路径,就像测试正常执行路径一样。
本教程通过实际示例介绍了 FreeBasic 的 Error 关键字,展示了其在不同场景下的用法。