2010/4/21 Mark J. Reed <[email protected]>:
> On Wed, Apr 21, 2010 at 9:37 AM, Laurent PETIT <[email protected]>
> wrote:
>>
>> Hi,
>>
>> Something I don't understand: if the call to (API/getConnection ...)
>> fails, there is nothing to close, right ?
>>
>> So for the problem of ensuring that any open connection is always
>> closed, the following pattern seems enough:
>>
>> (try
>> (let [conn (API/getConnection ..)]
>> XXX)
>> (finally (API/closeConnection conn)))
Of course, My code was wrong, and I meant
(let [conn (API/getConnection ..)]
(try
XXX
(finally (API/closeConnection conn)))
And really, catching exceptions thrown by API/getConnection is not in
the problem domain of ensuring balanced pairs of opened/closed
connections, e.g. should be outside the abstraction you put in place
for handling this (e.g. with-open).
Ensuring that opened connections are closed is a resource (I/O)
management problem.
Handling the case where you were not able to open a connection is an
application problem. You might place the try/catch right around the
let, have a global handling very high in the call stack, or even have
no try/catch at all.
HTH,
--
Laurent
>
> That would be great, but it doesn't work, because "conn" doesn't exist any
> more by the time you get to the finally block. That's the problem being
> addressed in this thread.
> So you can do this:
> (let [conn (API/getConnection ...)]
> (try
> XXX
> (finally (API/closeConnection conn))))
> But then any exception thrown by API/getConnection is not caught.
>
> So you have to do this:
> (try
> (let [conn (API/getConnection ...)]
> (try
> XXX
> (finally (API/closeConnection conn))))
> (catch ...))
> But that still won't work if the catch block also needs access to "conn".
> So you wind up with something like this:
> (try
> (let [conn (API/getConnection ...)]
> (try
> XXX
> (catch ExceptionAfterConnect x (do-something-with conn))
> (finally (API/closeConnection conn))))
> (catch .ExceptionDuringConnect x (do-something-without-conn))))
> --
> Mark J. Reed <[email protected]>
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en