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

Ian*_*oyd 8 lua exception-handling try-catch try-finally

没有办法模拟一种try-finallytry-except没有它们的语言?

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

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

就在这一刻,我正在努力创造一个try-finallyLua; 但我认为任何解决方案也适用于其他语言.

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

但从来没有伤害过要求.

Nic*_*las 15

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

您可以使用它pcall来执行任何Lua函数.如果该函数(或它调用的任何函数)调用error(如果断言条件不为真,则assert调用error),然后流控制将返回到pcall语句的站点.在pcall将返回FALSE,错误消息(什么是传递到error).

有了这个,你可以"抛出"错误并"捕获"它们.你的"尝试"只是pcall; 你的"catch"语句会检查pcall结果.

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