3

我正在寻找与流行的 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 会吃掉异常并阻止正确的错误上下文向上传递。也许有一种方法可以在不弄乱错误上下文的情况下重新抛出原始异常?

4

2 回答 2

2

您可以抛出捕获的错误,它将是原始错误,带有原始错误位置和其他任何内容,因此 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
于 2014-08-19T20:39:46.387 回答
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
于 2016-05-25T05:07:00.883 回答