错误清理

在诸如 C 语言之类的语言中,@goto 语句通常用于确保函数清除必要的资源,即使出现错误也是如此。这在 Julia 中不那么重要,因为通常使用例外和 try-finally 块。

但是,Julia 代码可能与 C 代码和 C API 接口,因此有时候函数仍然需要像 C 代码一样编写。以下示例是设计的,但演示了一个常见的用例。Julia 代码将调用 Libc.malloc 来分配一些内存(这模拟了一个 C API 调用)。如果不是所有分配都成功,那么该函数应该释放到目前为止获得的资源; 否则,返回分配的内存。

using Base.Libc
function allocate_some_memory()
    mem1 = malloc(100)
    mem1 == C_NULL && @goto fail
    mem2 = malloc(200)
    mem2 == C_NULL && @goto fail
    mem3 = malloc(300)
    mem3 == C_NULL && @goto fail
    return mem1, mem2, mem3

@label fail
    free(mem1)
    free(mem2)
    free(mem3)
end