我正在寻找与流行的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
但是TRY…ObjectScript中的CATCH语法不支持FINALLY子句。
特别重要的是,通常由finally块完成的这两个操作都为真:
- 清除代码总是在执行返回给调用者之前运行,无论是出现错误还是一切正常运行。
- 如果发生错误,原始错误及其代码位置、上下文和堆栈将沿调用堆栈向上传播到原始调用者。清理代码不应该干扰调试。
我不能简单地使用常规的TRY…CATCH块,因为CATCH将吃掉异常并阻止正确的错误上下文向上传递。也许有一种方法可以在不搞乱错误上下文的情况下重新抛出原始异常?
你可以抛出捕获的错误,它将是原始错误,错误的原始位置和其他任何东西,所以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
在TRY和CATCH块中同时写一个GoTo命令不是更容易吗?如果CATCH块包含一个GOTO命令,控制将直接转到指定的位置。这个位置可以像"Finally"块一样工作,并执行清理步骤。
一个示例看起来像这样:
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