<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">From: Florian Weimer &lt;<a href="mailto:fw@deneb.enyo.de">fw@deneb.enyo.de</a>&gt;<br><br>
* Henning Thielemann:<br>
<br>
&gt; Some open/close pairs have corresponding &#39;with&#39; functions, that are<br>
&gt; implemented using Exception.bracket. You can also use them within<br>
&gt; GHCi. I think using both manual resource deallocation and finalizers<br>
&gt; makes everything more complicated and more unreliable.<br>
<br>
It seems that Exception.bracket does not work in all cases, see the<br>
recent &quot;MonadCatchIO, finally and the error monad&quot; thread.<br>
<br>
Anyway, the ability of closures (and threads) means that something<br>
like Exception.bracket does not prevent access to closed handles, so<br>
I still need an additional safety net.<br></blockquote><div><br></div><div>Enumeration-based interfaces will prevent access to closed handles[1], [2], etc.  You can use this style for more than just handles and sockets, e.g. Takusen uses it for database connections.</div>
<div><br></div><div>I think somebody else already mentioned region-based management, which is also completely safe AFAIK.</div><div><br></div><div>[1] <a href="http://hackage.haskell.org/package/iteratee">http://hackage.haskell.org/package/iteratee</a></div>
<div>[2] <a href="http://hackage.haskell.org/package/enumerator">http://hackage.haskell.org/package/enumerator</a></div></div><br>