【问题标题】:How to simulate try-finally or try-except in languages that don't have them如何在没有它们的语言中模拟 try-finally 或 try-except
【发布时间】:2023-04-01 14:18:01
【问题描述】:

是否有任何方法可以用没有 try-finallytry-except 的语言模拟它们?

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

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

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

尽管在我的一生中,如果没有语言基础设施提供的管道,我无法弄清楚如何处理异常。

但问也无妨。

【问题讨论】:

  • “断言”功能不是一个选项吗? lua.org/pil/8.3.html
  • @Will 抛出异常没有问题,无论是由我还是由我不是。我只需要阻止他们。 assert 能做到吗?
  • 是的,我相信 assert 会阻止异常被抛出,并允许您引发自己的异常。哦,Gerald 发布的还有另一个很好的功能,pcall。我对 Lua 中的错误处理不太熟悉,但我相信有一些函数可以满足您的需求。
  • @Will我把它读成相反的:“assert(io.open(name, "r")); 这是一个典型的Lua习惯用法:如果io.open失败,assert会引发错误。”跨度>
  • 啊,我想我错了,但我在答案部分的朋友似乎有一些好主意:-)

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


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 链接已损坏 :(
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Lua 已经有必要的机制来做一些与异常不完全不同的事情。即pcall

      您可以使用pcall 执行任何 Lua 函数。如果该函数(或它调用的任何函数)调用error(如果断言条件不成立,assert 调用error),那么流控制将返回到pcall 语句所在的位置。 pcall 将返回 false 和错误消息(传递给 error 的内容)。

      有了这个,您可以“抛出”错误并“捕捉”它们。您的“尝试”只是pcall;您的“catch”语句用于检查 pcall 结果。

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

      【讨论】:

      • 在这种情况下,"cleanup" 表示:suppressFlag++; pcall(doStuff); suppressFlag--;。看起来我最初的恐惧是正确的——没有语言支持,捕捉任意错误是不可能的。但是找到pcall 的工作非常出色。我用谷歌搜索了大约 5 分钟,找不到任何东西。
      • 我知道这个答案很旧,但我必须说我不同意你的最后一段。文件句柄、数据库连接和各种非内存资源都不会被垃圾回收。这就是 finally-like 结构在其他垃圾收集语言中的用途。
      • Lua 4 怎么样?它没有pcall 函数。
      • @posfan12: 怎么样? Lua 4 可以追溯到 2001 年,而 Lua 5 仅在 3 年后问世。对于大多数应用程序来说,它太老了,无法关心,而那些你必须使用它的应用程序将不得不生活在它的限制范围内。
      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      相关资源
      最近更新 更多