虽然我经常使用try / catch,但是finally
或rethrow
并不需要。为了扩大我的知识并可能改善我正在开发的应用程序,人们将如何使用其他选项?我主要在Lucee工作,通常参考cfdocs上的文档,但是专门针对这个问题cfdocs.org/cftry,并且示例不会进入finally
或rethrow
中。甚至是throw
(但我对throw
很熟悉)。
示例代码可能不仅对文档本身有帮助。
答案 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是一个很好的资源。