haskell bracket:如何忽略“release resource”函数中的异常?

ndasle7k  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(102)

bracket的当前行为导致下面的表达式抛出inside release。然而,这种行为对我的用例不起作用。
哪个标准Haskell函数会抛出由核心操作引发的原始异常,即它会抛出inside action

bracket 
  (pure ()) -- acquire resource
  (const $ UnliftIO.throwString "inside release") -- release resource
  (const $ UnliftIO.throwString "inside action") -- action which uses the resource

字符串

**为什么我需要这个?**在我的例子中,“resource”正在运行一个SQL语句,只要会话存在,该语句就会影响SQL连接。我想确保该SQL语句的效果总是通过“release resource”撤消。但是,如果“core action”本身有SQL错误,那么“release resource”总是失败,current transaction is aborted, commands ignored until end of transaction block完全覆盖了操作抛出的核心/底层异常。

t9eec4r0

t9eec4r01#

在我看来,你可以在release函数中捕获错误:

bracket 
  (pure ())
  (const $
    catch 
      (UnliftIO.throwString "inside release") 
      (\(_ :: StringException) -> pure ()))
  (const $ UnliftIO.throwString "inside action")

字符串

xa9qqrwz

xa9qqrwz2#

你可以从safe-exception中尝试bracket。从技术上讲,它并没有指定在清理操作中发生异常时的确切行为,但它实际上做了正确的事情,即当两个操作都是同步的时候,它更喜欢内部操作的异常。
不直接相关,但如果发布操作失败并出现current transaction is aborted错误,则说明您的发布操作出错了。我假设您使用的是postresql,如果前面的语句失败,则不允许使用数据库连接。您可能正在尝试回滚事务,但您应该立即关闭连接。

相关问题