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