intersystems-cache - Caché ObjectScript 中的 Try-Finally 等价物

标签 intersystems-cache try-finally mumps objectscript

我正在寻找与流行的 Try-Finally 异常清理模式等效的语义,例如Why use try … finally without a catch clause?

想法是无论代码是成功还是失败,您都需要执行清理步骤,但清理代码不应干扰报告和处理错误。还是出了点问题,异常应该仍然传播。

我想写这样的东西:

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 block 完成的事情都成立:

  • 清理代码总是在执行返回给调用者之前运行,无论是在出现错误时还是在一切正常运行时。
  • 如果发生错误,原始错误及其代码位置、上下文和堆栈将在调用堆栈中传播到原始调用者。清理代码不应干扰调试。

我不能简单地使用常规的 TRY...CATCH block ,因为 CATCH 会吃掉异常并阻止正确的错误上下文向上传递。也许有一种方法可以在不弄乱错误上下文的情况下重新抛出原始异常?

最佳答案

你可以throw捕获到错误,这将是原始错误,带有错误的原始位置和其他任何内容,因此 Try-Finally 可能如下所示。

try {
    // some code that could be with errors
} catch ex {
}
// finally

throw:$g(ex) ex
// rest code that can't execute if was error

关于intersystems-cache - Caché ObjectScript 中的 Try-Finally 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25390794/

相关文章:

java - 在 Java 中,什么时候执行构造函数中的最后一个 block ?

GT.M 数据库的 golang 包

programming-languages - 腮腺炎编程检查超时

linux - 如何从 shellscript 对系统间缓存执行一些命令?

windows - 重定向当前IO设备,用于3rd方例程交互

intersystems-cache - 如何转义 InterSystems Caché SQL 中的保留字(关键字)?

java - finally block 中的堆栈溢出错误处理

intersystems-cache - 更新由向导基于类生成的表单

java - 如何在 Java 中处理 finally block 中的抛出异常