ZetCode

FreeBasic 异常处理:Try/Catch/Throw

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

FreeBasic 的 TryCatchThrow 关键字提供了结构化的异常处理。它们有助于优雅地处理运行时错误。

基本定义

Try 定义了一个可能发生异常的代码块。Catch 处理在 Try 块中抛出的异常。Throw 显式引发一个异常。

异常处理将错误处理与正常程序流分开。它通过集中错误管理使代码更健壮、更易于维护。

简单的 Try/Catch 示例

这个基础示例演示了异常处理的基本结构。

simple_try_catch.bas
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 块来捕获不同的异常类型。

multiple_catch.bas
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 块可以嵌套以在不同级别处理异常。

nested_try_catch.bas
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_exception.bas
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 函数会抛出除零异常。调用代码捕获并处理此异常,从而防止程序终止。

自定义异常对象

您可以创建自定义类型以进行更复杂的异常处理。

custom_exception.bas
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 块,用于始终执行的清理代码。

finally_block.bas
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 块确保无论是否发生异常,文件都会被关闭。这对于资源管理和防止泄漏至关重要。

重新抛出异常

有时您需要捕获一个异常,执行一些处理,然后重新抛出它。

rethrow_exception.bas
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 处理相同的异常,展示了如何实现分层错误处理。

最佳实践

本教程通过 Try/Catch/Throw 在不同场景下的实际示例,介绍了 FreeBasic 异常处理。

作者

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

列出所有 FreeBasic 教程