如何在没有它们的语言中模拟try-finally或try-except

时间:2012-01-02 02:23:29

标签: exception-handling lua try-catch try-finally

是否有任何方式来模拟没有它们的语言中的try-finallytry-except

如果有一些随机的,不可预测的异常发生,我需要确保一些清理运行。

可以尝试确保抛出没有异常,这样我确定我的清理代码总是运行 - 但后来我不需要try-finally/except

这一刻我正试图在Lua中创建一个try-finally;但我认为任何解决方案都适用于其他语言。

虽然,就我而言,如果没有语言基础设施提供的管道,我无法弄清楚如何处理异常。

但永远不要伤心。

4 个答案:

答案 0 :(得分:15)

Lua已经拥有必要的机制来完成与异常不同的事情。即pcall

您可以使用pcall执行任何Lua功能。如果该函数(或它调用的任何函数)调用error(如果断言条件不为真,则assert调用error),那么流控制将返回{{1}的站点声明。 pcall将返回false和错误消息(传递给pcall的内容)。

有了这个,你可以“抛出”错误并“抓住”它们。你的“尝试”只是error;你的“catch”语句检查pcall结果。

另外,请记住:Lua是垃圾收集环境。你不应该做任何清理工作。或者,如果你这样做,你需要改变Lua模块所需的任何东西。 Lua API应该是Lua API,而不是C或C ++ API。

答案 1 :(得分:2)

从未在lua中编程(这是你标记为的)。但是,包含这一个http://jessewarden.com/2011/01/lua-for-actionscript-developers.html的几个网页提到受保护的调用(pcall)是lua错误处理设备。

希望这有帮助。

答案 2 :(得分:0)

通常,可以使用signal()函数捕获异常。不确定lua会支持这样的。在C中,这就是你要使用的。这是一个很大的烦恼! (有点复杂。)

答案 3 :(得分:0)

这个Lua Exception Handling system怎么样?您还可以使用Lua RAII机制。