FreeBasic 异常处理:Try/Catch/Throw
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Try、Catch 和 Throw 关键字提供了结构化的异常处理。它们有助于优雅地处理运行时错误。
基本定义
Try 定义了一个可能发生异常的代码块。Catch 处理在 Try 块中抛出的异常。Throw 显式引发一个异常。
异常处理将错误处理与正常程序流分开。它通过集中错误管理使代码更健壮、更易于维护。
简单的 Try/Catch 示例
这个基础示例演示了异常处理的基本结构。
Try
Print "Inside Try block"
Throw "An error occurred"
Print "This won't execute"
Catch (e As String)
Print "Caught exception: "; e
End Try
该代码抛出一个字符串异常,该异常被 Catch 块捕获。由于控制转移到 Catch,第二个 Print 语句从未执行。
捕获不同的异常类型
FreeBasic 允许使用多个 Catch 块来捕获不同的异常类型。
Try
Dim choice As Integer = 2
Select Case choice
Case 1: Throw "String exception"
Case 2: Throw 42
Case 3: Throw 3.14
End Select
Catch (e As String)
Print "Caught string: "; e
Catch (e As Integer)
Print "Caught integer: "; e
Catch (e As Double)
Print "Caught double: "; e
End Try
此示例演示了如何处理不同的异常类型。根据抛出的异常类型,将执行相应的 Catch 块。
嵌套的 Try/Catch 块
Try/Catch 块可以嵌套以在不同级别处理异常。
Try
Try
Throw "Inner exception"
Catch (e As String)
Print "Inner catch: "; e
Throw "Outer exception" ' Re-throw
End Try
Catch (e As String)
Print "Outer catch: "; e
End Try
内部的 Catch 处理第一个异常,然后抛出一个新的异常。外部的 Catch 处理这个第二个异常,演示了异常的传播。
函数中的异常处理
函数可以抛出异常,这些异常由调用代码捕获。
Function Divide(a As Integer, b As Integer) As Double
If b = 0 Then
Throw "Division by zero"
End If
Return a / b
End Function
Try
Print Divide(10, 2)
Print Divide(5, 0)
Catch (e As String)
Print "Error: "; e
End Try
Divide 函数会抛出除零异常。调用代码捕获并处理此异常,从而防止程序终止。
自定义异常对象
您可以创建自定义类型以进行更复杂的异常处理。
Type MyException
Message As String
ErrorCode As Integer
End Type
Try
Dim ex As MyException
ex.Message = "Custom error"
ex.ErrorCode = 1001
Throw ex
Catch (e As MyException)
Print "Custom exception caught:"
Print "Message: "; e.Message
Print "Code: "; e.ErrorCode
End Try
此示例定义了一个具有附加信息的自定义异常类型。Catch 块访问这些属性以进行更详细的错误处理。
Finally 块
FreeBasic 支持 Finally 块,用于始终执行的清理代码。
Dim fileNum As Integer
Try
fileNum = FreeFile()
Open "test.txt" For Input As #fileNum
' File operations here
Throw "Simulated error"
Catch (e As String)
Print "Error: "; e
Finally
If fileNum > 0 Then
Close #fileNum
Print "File closed in Finally block"
End If
End Try
Finally 块确保无论是否发生异常,文件都会被关闭。这对于资源管理和防止泄漏至关重要。
重新抛出异常
有时您需要捕获一个异常,执行一些处理,然后重新抛出它。
Sub ProcessData()
Try
Throw "Data processing failed"
Catch (e As String)
Print "Logging error: "; e
Throw ' Re-throw the same exception
End Try
End Sub
Try
ProcessData()
Catch (e As String)
Print "Caught rethrown exception: "; e
End Try
内部的 Catch 在重新抛出之前记录错误。然后外部的 Catch 处理相同的异常,展示了如何实现分层错误处理。
最佳实践
- 特定异常:先捕获最特定的异常类型。
- 有意义的消息:提供描述性的异常消息。
- 资源清理:使用 Finally 来释放资源。
- 不要忽略:避免吞噬异常的空 Catch 块。
- 文档:记录函数可能抛出的异常。
本教程通过 Try/Catch/Throw 在不同场景下的实际示例,介绍了 FreeBasic 异常处理。