在CachéObjectScript中尝试最终等效

时间:2014-08-19 18:46:09

标签: 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块完成的这两件事都是正确的:

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

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

2 个答案:

答案 0 :(得分:1)

你可以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

答案 1 :(得分:0)

在TRY和CATCH块中编写GoTo命令不是一个更容易的选择。 如果CATCH块包含GOTO命令,则控制直接进入指定位置。这个位置可以像"最后"阻止并执行清理步骤。

示例看起来像这样:

try {
    // some code that could be with errors
   GOTO xxx , 'This is the last statement of TRY block
} catch ex {
    //Handle the error
   GOTO XXX
}

XXX
  'your clean up steps