在 Coldfusion/Lucee 中尝试/捕捉/投掷/最后/重新投掷

Try / Catch / Throw / Finally / Rethrow in Coldfusion/Lucee

虽然我经常使用 try/catch,但我不需要 finallyrethrow。在我寻求拓宽我的知识并可能改进我使用的应用程序的过程中,人们将如何使用这些额外的选项?我主要在 Lucee 工作,通常参考 cfdocs but specifically for this question cfdocs.org/cftry 上的文档,并且这些示例不会进入 finallyrethrow... 甚至 throw 中(但我熟悉throw)。

示例代码可能对我的帮助不仅仅是关于此的文档。

A finally 块在您管理资源(如文件句柄)时很有用。它可以在有或没有 catch 块的情况下使用。您通常会看到的示例是关闭文件句柄:

var f = fileopen(filename, "r")
try {
    // Some dubious code
} finally {
    // f is freed, regardless of any exception thrown within the try block
    fileclose(f);
}

无论 try 块内是否抛出异常,都会调用 finally 块。

rethrow 如果您最终想将异常冒泡到调用堆栈中,则很方便,但首先要对其进行一些处理。我经常发现自己在重新抛出异常以生成一般错误页面之前记录异常:

try {
    // Something sketchy
} catch (any e) {
    writelog(type="Error", file="uhoh.log", text=e.message);
    rethrow;
}

rethrow 在处理只能通过内省识别的奇怪 ColdFusion 异常时也很有用,而不是通过类型捕获它们。也许您想忽略当您未编写的粗略身份验证代码(是的,这是根据经验)遇到无效会话时抛出的某个异常,但冒泡其他任何东西:

try {
    // Hey, external code, is this user authenticated?
} catch (any e) {
    if (e.id != MAGIC_NUMBER_TO_IGNORE)
        rethrow;
}

Ben Nadel 的 ColdFusion blog.

一如既往地是一个很好的资源