在Data.Pool中,如果创建新资源的操作引发异常,会发生什么情况?
问题描述:
Data.Pool,createPool
的第一个参数是“创建新资源的动作”。在Data.Pool中,如果创建新资源的操作引发异常,会发生什么情况?
如果此操作引发异常,会发生什么情况?我可以控制会发生什么吗? (恐怕它会进入一个无限循环,它会不断尝试创建一个新的资源。)
(对于withResource
函数,他们说:“如果操作抛出任何类型的异常,资源是破坏了,没有回到游泳池“,但是这看起来像是完全不同的东西,这似乎是之后这个资源已经成功创建了,所以我想这不是解决我上面问题的线索。 )
答
直到您takeResource
或tryTakeResource
并且池中没有资源时才会创建资源。如果创建资源的操作引发异常,则该池将保持不变,并在调用代码中引发异常。如果您反复拨打takeResource
或tryTakeResource
,即使先前的调用已引发异常,create action也会重复执行。 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
的代码中引发。