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
完全覆盖了操作抛出的核心/底层异常。
2条答案
按热度按时间t9eec4r01#
在我看来,你可以在release函数中捕获错误:
字符串
xa9qqrwz2#
你可以从safe-exception中尝试
bracket
。从技术上讲,它并没有指定在清理操作中发生异常时的确切行为,但它实际上做了正确的事情,即当两个操作都是同步的时候,它更喜欢内部操作的异常。不直接相关,但如果发布操作失败并出现
current transaction is aborted
错误,则说明您的发布操作出错了。我假设您使用的是postresql,如果前面的语句失败,则不允许使用数据库连接。您可能正在尝试回滚事务,但您应该立即关闭连接。