【问题标题】:Multiple exception handlers for file processing用于文件处理的多个异常处理程序
【发布时间】:2013-06-15 13:47:48
【问题描述】:

我想我的大脑快湿透了。有人可以解释为完成以下任务的最佳方式吗?

我想打开一个文件,用它做一些事情,然后关闭它。我想确保在所有情况下,文件肯定是关闭的。如果打开文件失败(不存在、访问被拒绝等),我还想运行特定的 I/O 操作

为了清理,我大概想要bracket,为了处理打开失败,我大概想要try 的一些变体。但我无法决定将这些组合在一起的最佳方式,以便它做正确的事情,而不留下任何“差距”(在错误时刻出现异常可能会破坏东西的地方)。

【问题讨论】:

    标签: haskell exception-handling io


    【解决方案1】:

    使用try 打开文件。如果成功使用finally 处理文件句柄,然后关闭文件。如果打开文件不成功,请进入您的错误案例。所以代码应该是这样的:

    do
      res <- try (openFile filename mode)
      case res of
        Right handle ->
          finally (workWith handle) (hClose handle)
        Left (e :: SomeException) ->
          handleOpeningError e
    

    如果openFile 失败,这将执行handleOpeningError 操作,并且在所有情况下都会关闭文件句柄。如果在workWith handle 期间发生异常,则在关闭文件句柄后将重新抛出该异常(如果我理解正确,您只想处理openFile 抛出的异常,否则您只想确保文件已关闭)。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 谁说过 lazy I/O?我想要一个句柄,这样我就可以阅读严格的 ByteStrings 并进行大量的来回搜索。我的印象是,上面的库是为顺序访问而设计的,而不是随机访问。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多