尝试/抓住/投掷/最后/在Coldfusion / Lucee中重新投掷

时间:2018-08-02 23:08:42

标签: coldfusion lucee

虽然我经常使用try / catch,但是finallyrethrow并不需要。为了扩大我的知识并可能改善我正在开发的应用程序,人们将如何使用其他选项?我主要在Lucee工作,通常参考cfdocs上的文档,但是专门针对这个问题cfdocs.org/cftry,并且示例不会进入finallyrethrow中。甚至是throw(但我对throw很熟悉)。

示例代码可能不仅对文档本身有帮助。

1 个答案:

答案 0 :(得分:2)

在管理资源(例如文件句柄)时,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);
}

无论是否在finally块内引发异常,都会调用try块。

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是一个很好的资源。