Re: Possibility to add finally to try/catch?
| From: | Tom Boutell | Date: | Tue, 28 Feb 2012 17:18:09 +0000 |
| Subject: | Re: Possibility to add finally to try/catch? | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-58259@lists.php.net to get a copy of this message | ||
OK, consider my point successfully buried in counterexamples (:
On Tue, Feb 28, 2012 at 12:02 PM, Kiall Mac Innes <kiall@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 <kiall@managedit.ie> wrote:
>>
>> On Tue, Feb 28, 2012 at 4:48 PM, Tom Boutell <tom@punkave.com> wrote:
>>>
>>> On Tue, Feb 28, 2012 at 11:32 AM, Kiall Mac Innes <kiall@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