Hi .. On Wednesday 09 February 2005 11:31, Kent Sibilev wrote: > Mark Probert <probertm / acm.org> writes: > > Can someone please let me know what I am doing wrong here? > > I can't seem to catch the exception .. > > > > Exception is being thrown from the outside of begin...end construct. Try > this: > Many thanks. The t.close() in the ensure is out of scope, so that the final result looks like: require 'socket' def alive(host, port=80) s = "host=#{host} : " t = TCPSocket.new(host, port) s << " made it!" t.close return s rescue Errno::ETIMEDOUT s << " Timed out -- node unreachable" rescue Exception => e s << " exception = #{e}" end puts alive('10.10.10.2') So, the next question I have is how does this actually work? Is there some kind of implicit block around the code? If so, why does the explicit begin .. end construct not work? How can I use an ensure for this? Also, whilst I am at it ;-), I used the first formulation t = TCPSocket.new() begin <stuff> rescue <errors> ensure t.close end because t is not in scope if the creator is inside the begin .. end block. I recall that this is the subject of much debate. How has it been resolved? -- -mark. (probertm at acm dot org)