代码之家  ›  专栏  ›  技术社区  ›  HPWD

在Coldfusion/Lucee中Try/Catch/Throw/Finally/Rethrow

  •  1
  • HPWD  · 技术社区  · 6 年前

    虽然我经常使用try/catch,但我不需要 finally rethrow . 在我努力拓宽知识面并潜在地改进我正在开发的应用程序的过程中,人们将如何使用这些附加选项?我主要在Lucee工作,通常参考 cfdocs 但特别是这个问题 cfdocs.org/cftry 但这些例子并没有深入到 最后 再流 ... 甚至 throw 但我很熟悉 ).

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Rain    6 年前

    一个 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 不管是不是堵住。

    rethrow 如果您最终想要在调用堆栈中冒泡异常,但首先要对其执行一些操作,那么这很方便。我经常发现自己在重新引发异常以生成一般错误页之前记录了异常:

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

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

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

    像往常一样,一个好的资源是本·纳德尔的 ColdFusion blog .

    推荐文章