An an equivalent snippet of ruby..
$ irb
irb(main):001:0> def divide(x, y)
irb(main):002:1> begin
irb(main):003:2* result = x / y
irb(main):004:2> puts "result is", result
irb(main):005:2> rescue ZeroDivisionError
irb(main):006:2> puts "division by zero!"
irb(main):007:2> raise Exception('division by zero')
irb(main):008:2> ensure
irb(main):009:2* puts "executing finally clause"
irb(main):010:2> end
irb(main):011:1> end
=> nil
irb(main):012:0>
irb(main):013:0*
irb(main):014:0* divide(2, 1)
result is
2
executing finally clause
=> nil
irb(main):015:0>
irb(main):016:0* divide(2, 0)
division by zero!
executing finally clause <====== The interesting part
NoMethodError: undefined method `Exception' for main:Object
from (irb):7:in `divide'
from (irb):16
from :0
irb(main):017:0>
irb(main):018:0* divide("2", "1")
executing finally clause
NoMethodError: undefined method `/' for "2":String
from (irb):3:in `divide'
from (irb):18
from :0
Thanks,
Kiall
On Tue, Feb 28, 2012 at 4:54 PM, Kiall Mac Innes <[email protected]> wrote:
> On Tue, Feb 28, 2012 at 4:48 PM, Tom Boutell <[email protected]> wrote:
>
>> On Tue, Feb 28, 2012 at 11:32 AM, Kiall Mac Innes <[email protected]>
>> wrote:
>> > Yes, You could abstract the try/catch into a new (and un-needed)
>> function
>> > to try and emulate the behavior of finally.. Unless, for example, you
>> > re-throw the exception after logging in the catch.
>>
>> 'finally' doesn't run for stuff that throws an exception not caught in
>> the try { } block, or an exception thrown again in the catch { } block
>> - does it?
>>
>> I would hope not, since that means "something this block of code did
>> not anticipate at all - another sort of exceptional situation
>> altogether" and really should not run any more local code, nothing
>> until and unless there is a catch block somewhere further up that does
>> catch that exception.
>>
>
> I would indeed expect the finally to run regardless of what happens in the
> catch block.
>
> $ python
> >>> def divide(x, y):
> ... try:
> ... result = x / y
> ... except ZeroDivisionError:
> ... print "division by zero!"
> ... raise Exception('division by zero')
> ... else:
> ... print "result is", result
> ... finally:
> ... print "executing finally clause"
> ...
> >>> divide(2, 1)
> result is 2
> executing finally clause
> >>>
> >>> divide(2, 0)
> division by zero!
> executing finally clause <====== The interesting part
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 6, in divide
> Exception: division by zero
> >>>
> >>> divide("2", "1")
> executing finally clause
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 3, in divide
> TypeError: unsupported operand type(s) for /: 'str' and 'str'
>