Thanks for the reply Alex,

I thought of 2 try blocks, but seems over engineering doesn't it ?  I
actually need to open 2 connections simultaneously, which would amount
to 3 nested try blocks. The whole code gets cluttered with all these
try finally (and one catch) statements.

  (try
    (let [conn1 (API1/getConnection ..)]
      (try
        (let [conn2 (API2/getConnection ..)]
          (try
            ( ........... Do something with conn1 conn2 ............)
            (finally
              (API2/closeConnection conn2))))
        (finally
          (API1/closeConnection conn1))))
    (catch Exception ex (.printStackTrace ex)))

The macro solution looks good.  But with 2 different APIs for 2
connections, I would need to write 2 macros right?

(defmacro with-api1-connection [conn-sym arg1 arg2 & body]
  `(let [~conn-sym (API1/getConnection ~arg1 ~arg2)]
     (try
      ~...@body
      (finally (API1/closeConnection ~conn-sym)))))

(defmacro with-api2-connection [conn-sym arg1 arg2 arg3 & body]
  `(let [~conn-sym (API2/getConnection ~arg1 ~arg2 ~arg3)]
     (try
      ~...@body
      (finally (API2/closeConnection ~conn-sym)))))

Also coming back to the original requirement, wanted to know what are
the problems with providing support (somehow) for something like -

(try
  (let [conn1 (API1/getConnection ..)
         conn2 (API2/getConnection ..)]
    (....))
  (catch ..)
  (finally
    (if conn1 (API1/closeConnection conn1))
    (if conn2 (API2/closeConnection conn2))))


Coming from Java, this would be implemented as -

Connection1 conn1 = null;
Connection2 conn2 = null;
try {
  conn1 = API1.getConnection ..;
  conn2 = API2.getConnection ..;
  ...
}
catch (){}
finally {
  if (conn1 != null)
    API1.closeConnection(conn1);
  if (conn2 != null)
    API2.closeConnection(conn2);
}

I agree that this code doesn't look good from a purist pov, but any
issues besides that?

- Thanks!

On Apr 21, 4:58 pm, Alex Osborne <a...@meshy.org> wrote:
> ka <sancha...@gmail.com> writes:
> > How can I do something like ...
>
> > (try
> >   (let [conn (API/getConnection ..)]
> >     (....))
> >   (catch ..)
> >   (finally (if conn (API/closeConnection conn))))
>
> > Problem is that conn is unavailable in the finally context.
>
> Why not just have two try blocks?
>
> (try
>  (let [conn (API/getConnection ..)]
>    (try
>     (....)
>     (finally (API/closeConnection conn))))
>  (catch ...))
>
> For these sorts of things I usually try to use with-open, or if
> with-open is not applicable do my own similar macro:
>
> (defmacro with-api-connection [conn-sym arg1 arg2 & body]
>   `(let [~conn-sym (API/getConnection ~arg1 ~arg2)]
>      (try
>       ~...@body
>       (finally (API/closeConnection ~conn-sym)))))
>
> So then you never forget to close the connection:
>
> (try
>  (with-api-connection conn ...
>    (... do something with conn ...))
>  (catch ...))
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group 
> athttp://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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to