联合类型作为检查异常

发布者    |       Ceylon

我们已经讨论了很多关于 联合类型 的内容,甚至 看到了 一些 它们的 应用,但我没有提到的是,它们可以用作一种检查异常设施。考虑以下方法声明

shared String|Error format(String format, Object... args) { .... }

此方法返回类型 强制 你处理可能出现的错误结果,就像检查异常一样。你必须要么在调用代码中立即处理问题

String formatEntry(Entry e) {
    local result = format("%s->%s", $e.key, $e.value);
    if (is String result)
        return result; 
    }
    else { 
        return "Invalid entry"; 
    }
}

这里if/else扮演着try/catch的角色。Ceylon 的各种静态分析设施(在这种情况下,安全的缩窄构造if (is ...)和确定返回检查)共同作用,迫使你显式处理可能出现的错误.

或者你必须将错误的可能性向上传播

String|Error formatEntry(Entry e) {
    return format("%s->%s", $e.key, $e.value);
}

可以通过在联合中包含所有异常类型来表示多个异常类型,例如String|SomeError|OtherError,或者通过使用超类型,例如String|GenericError。就像对检查异常的语言级支持一样。

实际上,Ceylon 处理可选值的方式,其中类型X?只是X|Nothing的快捷方式,可以看作是这个模式的特殊情况。错误实际上是一个 null,它比null本身携带更多的信息。

我认为,鉴于Java中检查异常的糟糕表现,我们可能不应该在Ceylon中非常鼓励这种模式,但我可以想象它在某些情况下可能有用。特别是,有时可能需要提供一些关于为什么返回值是“null”的信息。


返回顶部