Haskell 在Data.Pool中,如果创建新资源的操作引发异常,会发生什么情况?

Haskell 在Data.Pool中,如果创建新资源的操作引发异常,会发生什么情况?,haskell,pool,Haskell,Pool,在中,createPool的第一个参数是“创建新资源的操作” 如果此操作引发异常,会发生什么情况?我能控制发生了什么吗?(我担心它会进入无限循环,不断尝试创建新资源。) (对于withResource函数,他们说:“如果操作引发任何类型的异常,资源将被销毁,而不会返回到池中。”但这似乎是一件完全不同的事情。这似乎是在成功创建资源之后发生的。因此,我想这不是回答我上述问题的线索。)只有在您takeResource或trytakesource并且池中没有资源时,才会创建资源。如果创建资源的操作引发异

在中,
createPool
的第一个参数是“创建新资源的操作”

如果此操作引发异常,会发生什么情况?我能控制发生了什么吗?(我担心它会进入无限循环,不断尝试创建新资源。)


(对于
withResource
函数,他们说:“如果操作引发任何类型的异常,资源将被销毁,而不会返回到池中。”但这似乎是一件完全不同的事情。这似乎是在成功创建资源之后发生的。因此,我想这不是回答我上述问题的线索。)

只有在您
takeResource
trytakesource
并且池中没有资源时,才会创建资源。如果创建资源的操作引发异常,则池将保持不变,并在调用代码中引发异常。如果重复调用
takeResource
tryTakeResource
,即使以前的调用引发了异常,创建操作也将重复执行。调用
takeResource
,不处理任何异常;如果创建资源的操作在
takeresource
中引发异常,则将在调用
withResource
的代码中引发异常


创建资源的代码位于和中。它们之间的区别在于当
使用==maxResources
获取资源
重试
s
trytakeresource
返回
Nothing

如果没有可用的条目,并且
已使用的
不是
最大资源
,它们都会执行以下操作:

create `onException` atomically (modifyTVar_ inUse (subtract 1))
创建资源时发生异常,使用的资源数不会更改,并且在调用代码
takeResource
trytakesource
时引发异常