OK, consider my point successfully buried in counterexamples (:

On Tue, Feb 28, 2012 at 12:02 PM, Kiall Mac Innes <ki...@managedit.ie> wrote:
> 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 <ki...@managedit.ie> wrote:
>>
>> On Tue, Feb 28, 2012 at 4:48 PM, Tom Boutell <t...@punkave.com> wrote:
>>>
>>> On Tue, Feb 28, 2012 at 11:32 AM, Kiall Mac Innes <ki...@managedit.ie>
>>> 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'
>
>



-- 
Tom Boutell
P'unk Avenue
215 755 1330
punkave.com
window.punkave.com

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to