我正在寻找与流行的 Try-Finally 异常清理模式等效的语义,例如为什么使用 try ... finally 而不使用 catch 子句?
这个想法是,无论代码是成功还是失败,您都有需要执行的清理步骤,但清理代码不应干扰报告和处理错误。仍然出现问题,异常应该仍然传播。
我想写这样的东西:
O TempFile:(/NEW:/WRITE:/STREAM)
U TempFile
L +LockName
TRY {
...code that uses TempFile and may throw an error
} FINALLY {
//Be sure to delete file whether we have an error or not
O TempFile:(/DELETE)
C TempFile
//Be sure to release lock
L -LockName
}
... Rest of code that should only execute if there was no error
但是 ObjectScript 中的 TRY...CATCH 语法不支持 FINALLY 子句。
尤其重要的是,通常由 finally 块完成的这两件事都是正确的:
- 清理代码总是在执行返回给调用者之前运行,无论是在发生错误时还是在一切正常运行时。
- 如果发生错误,原始错误及其代码位置、上下文和堆栈将通过调用堆栈传播到原始调用者。清理代码不应干扰调试。
我不能简单地使用常规的 TRY...CATCH 块,因为 CATCH 会吃掉异常并阻止正确的错误上下文向上传递。也许有一种方法可以在不弄乱错误上下文的情况下重新抛出原始异常?