在Data.Pool中,createPool
的第一个参数是“创建新资源的操作”。
如果此操作引发异常,会发生什么?我可以控制会发生什么吗? (我担心它会进入无限循环,不断尝试创建新资源。)
(对于withResource
函数,他们说:“如果操作抛出任何类型的异常,资源就会被破坏,而不会返回到池中。”但这似乎完全不同。似乎发生了 之后资源已经成功创建。所以我想这不是我上述问题答案的线索。)
答案 0 :(得分:2)
在takeResource
或tryTakeResource
之前,资源尚未创建,且资源池中没有资源。如果创建资源的操作抛出异常,则池保持不变,并且在调用代码中引发异常。如果您反复调用takeResource
或tryTakeResource
,即使之前的调用已抛出异常,也会重复执行创建操作。 withResource
调用takeResource
而不处理任何例外情况;如果创建资源的操作在takeResoure
中抛出异常,则会在调用withResource
的代码中引发异常。
创建资源的代码位于takeResource
和tryTakeResource
。它们之间的区别在于used == maxResources
takeResource
retry
s; tryTakeResouce
会返回Nothing
。
如果没有可用的条目,并且used
不是maxResources
,则他们都会执行以下操作:
create `onException` atomically (modifyTVar_ inUse (subtract 1))
创建资源时发生异常时,资源inUse
的数量未发生变化,并且在调用takeResource
或tryTakeResource
的代码中引发异常。