在 Coldfusion/Lucee 中尝试/捕捉/投掷/最后/重新投掷
Try / Catch / Throw / Finally / Rethrow in Coldfusion/Lucee
虽然我经常使用 try/catch,但我不需要 finally
或 rethrow
。在我寻求拓宽我的知识并可能改进我使用的应用程序的过程中,人们将如何使用这些额外的选项?我主要在 Lucee 工作,通常参考 cfdocs but specifically for this question cfdocs.org/cftry 上的文档,并且这些示例不会进入 finally
或 rethrow
... 甚至 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.
一如既往地是一个很好的资源
虽然我经常使用 try/catch,但我不需要 finally
或 rethrow
。在我寻求拓宽我的知识并可能改进我使用的应用程序的过程中,人们将如何使用这些额外的选项?我主要在 Lucee 工作,通常参考 cfdocs but specifically for this question cfdocs.org/cftry 上的文档,并且这些示例不会进入 finally
或 rethrow
... 甚至 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.
一如既往地是一个很好的资源