Re: Possibility to add finally to try/catch?

From: 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

« previous php.internals (#58259) next »