Rub 1.9: "inline rescue" doesn't work?

Discussion in 'Ruby' started by Iñaki Baz Castillo, Mar 1, 2009.

  1. Hi, is there any explanation for the folowing big difference between the sa=
    me=20
    code in 1.8 and 1.9?:


    1.8)

    aaa =3D 123.capitalize rescue 444
    =3D> 444


    1.9)

    aaa =3D 123.capitalize rescue 444
    NoMethodError: undefined method `capitalize' for 123:Fixnum


    It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I miss=20
    something?

    Thanks a lot.



    =2D-=20
    I=C3=B1aki Baz Castillo
    Iñaki Baz Castillo, Mar 1, 2009
    #1
    1. Advertising

  2. El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:

    > It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I miss
    > something?


    Well, it must be something even worse since block rescue neither works:

    =2D----------------
    begin
    aaa =3D 123.capitalize
    rescue
    aaa =3D 444
    end
    =2D-----------------
    =3D> NoMethodError: undefined method `capitalize' for 123:Fixnum


    Perhaps it's due to the not updated version of Ruby1.9 I'm using?:

    $ irb1.9 -v
    irb 0.9.5(05/04/13)

    $ ruby1.9 -v
    ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]


    =2D-=20
    I=C3=B1aki Baz Castillo
    Iñaki Baz Castillo, Mar 2, 2009
    #2
    1. Advertising

  3. Re: Rub 1.9: "inline rescue" doesn't work? [SOLVED]

    El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:

    > Perhaps it's due to the not updated version of Ruby1.9 I'm using?:
    >
    > $ irb1.9 -v
    > irb 0.9.5(05/04/13)
    >
    > $ ruby1.9 -v
    > ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]


    Yes, it seems to be an old bug in my 1.9 version. I've upgraded to:

    $ ruby1.9 -v
    ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]

    and the "rescue" issue has gone.


    =2D-=20
    I=C3=B1aki Baz Castillo
    Iñaki Baz Castillo, Mar 2, 2009
    #3
  4. On Sun, Mar 1, 2009 at 19:01, I=C3=B1aki Baz Castillo <> wrote=
    :
    > El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
    >
    >> It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I mis=

    s
    >> something?

    >
    > Well, it must be something even worse since block rescue neither works:
    >
    > -----------------
    > begin
    > =C2=A0 =C2=A0 =C2=A0 =C2=A0aaa =3D 123.capitalize
    > rescue
    > =C2=A0 =C2=A0 =C2=A0 =C2=A0aaa =3D 444
    > end
    > ------------------
    > =3D> NoMethodError: undefined method `capitalize' for 123:Fixnum
    >
    >
    > Perhaps it's due to the not updated version of Ruby1.9 I'm using?:
    >
    > =C2=A0$ irb1.9 -v
    > =C2=A0irb 0.9.5(05/04/13)
    >
    > =C2=A0$ ruby1.9 -v
    > =C2=A0ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]


    miro:~ brian$ irb19
    >> aaa =3D 123.capitalize rescue 444

    =3D> 444
    miro:~ brian$ ruby19 -v
    ruby 1.9.2dev (2009-03-02 trunk 22700) [i386-darwin9.6.0]

    Brian.
    Brian Mitchell, Mar 2, 2009
    #4
  5. On Sun, Mar 1, 2009 at 6:58 PM, I=F1aki Baz Castillo <> wrote:
    > Hi, is there any explanation for the folowing big difference between the =

    same
    > code in 1.8 and 1.9?:
    >
    >
    > 1.8)
    >
    > aaa =3D 123.capitalize rescue 444
    > =3D> 444
    >
    >
    > 1.9)
    >
    > aaa =3D 123.capitalize rescue 444
    > NoMethodError: undefined method `capitalize' for 123:Fixnum


    >> RUBY_VERSION

    =3D> "1.9.1"
    >> 123.captialize rescue 444

    =3D> 444

    But please, don't use this technique. It creates huge debugging nightmares=
    Gregory Brown, Mar 2, 2009
    #5
  6. 2009/3/2 Gregory Brown <>:
    > On Sun, Mar 1, 2009 at 6:58 PM, I=C3=B1aki Baz Castillo <> w=

    rote:
    >> Hi, is there any explanation for the folowing big difference between the=

    same
    >> code in 1.8 and 1.9?:
    >>
    >>
    >> 1.8)
    >>
    >> aaa =3D 123.capitalize rescue 444
    >> =3D> 444
    >>
    >>
    >> 1.9)
    >>
    >> aaa =3D 123.capitalize rescue 444
    >> NoMethodError: undefined method `capitalize' for 123:Fixnum

    >
    >>> RUBY_VERSION

    > =3D> "1.9.1"
    >>> 123.captialize rescue 444

    > =3D> 444
    >
    > But please, don't use this technique. =C2=A0It creates huge debugging nig=

    htmares.
    >
    > Instead, just do:
    >
    > aaa =3D obj.respond_to?:)capitalize) ? obj.capitalize : 444
    >
    >

    I'd see it as a Ruby's failure that the proper check is against DRY.

    Thanks

    Michal
    Michal Suchanek, Mar 2, 2009
    #6
  7. Re: Rub 1.9: "inline rescue" doesn't work? [SOLVED]

    On Mon, Mar 2, 2009 at 9:23 AM, I=C3=B1aki Baz Castillo <> wro=
    te:
    > El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
    >
    >> Perhaps it's due to the not updated version of Ruby1.9 I'm using?:
    >>
    >> =C2=A0 $ irb1.9 -v
    >> =C2=A0 irb 0.9.5(05/04/13)
    >>
    >> =C2=A0 $ ruby1.9 -v
    >> =C2=A0 ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]

    >
    > Yes, it seems to be an old bug in my 1.9 version. I've upgraded to:
    >
    > =C2=A0$ ruby1.9 -v
    > =C2=A0ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]
    >
    > and the "rescue" issue has gone.


    That's still ancient. The latest revision is 22705 and the last stable
    release was 1.9.1.

    ^ manveru
    Michael Fellinger, Mar 2, 2009
    #7
  8. Iñaki Baz Castillo

    Phlip Guest

    Michal Suchanek wrote:

    >> aaa = obj.respond_to?:)capitalize) ? obj.capitalize : 444


    > I'd see it as a Ruby's failure that the proper check is against DRY.


    DRY is most egregious when the duplicated components are far apart from each
    other. (And hence harder to spot!) Duplicating things right next to each other
    is Mostly Harmless, and it's always the next best thing if you can't think of
    the final refactor.

    --
    Phlip
    http://www.zeroplayer.com/
    Phlip, Mar 2, 2009
    #8
  9. On Mon, Mar 2, 2009 at 3:18 AM, Michal Suchanek <> wrote=
    :
    > 2009/3/2 Gregory Brown <>:


    >> But please, don't use this technique. =A0It creates huge debugging night=

    mares.
    >>
    >> Instead, just do:
    >>
    >> aaa =3D obj.respond_to?:)capitalize) ? obj.capitalize : 444
    >>
    >>

    > I'd see it as a Ruby's failure that the proper check is against DRY.


    Agreed, but the costs of the elegance of using rescue as a conditional
    modifier stack up fast in any moderately complex system.

    -greg

    --=20
    Technical Blaag at: http://blog.majesticseacreature.com
    Non-tech stuff at: http://metametta.blogspot.com
    "Ruby Best Practices" Book now in O'Reilly Roughcuts:
    http://rubybestpractices.com
    Gregory Brown, Mar 2, 2009
    #9
  10. Iñaki Baz Castillo

    Ken Bloom Guest

    On Mon, 02 Mar 2009 09:36:10 -0500, Gregory Brown wrote:

    > On Mon, Mar 2, 2009 at 3:18 AM, Michal Suchanek <>
    > wrote:
    >> 2009/3/2 Gregory Brown <>:

    >
    >>> But please, don't use this technique.  It creates huge debugging
    >>> nightmares.
    >>>
    >>> Instead, just do:
    >>>
    >>> aaa = obj.respond_to?:)capitalize) ? obj.capitalize : 444
    >>>
    >>>

    >> I'd see it as a Ruby's failure that the proper check is against DRY.

    >
    > Agreed, but the costs of the elegance of using rescue as a conditional
    > modifier stack up fast in any moderately complex system.
    >
    > -greg



    The problem with the rescue modifier is that it lumps all types of errors
    into one relatively blunt tool. A rescue(Type) modifier would really
    help, and a ?. operator (like Groovy's) would resolve one of the most
    common cases for a rescue modifier.

    --Ken

    --
    Chanoch (Ken) Bloom. PhD candidate. Linguistic Cognition Laboratory.
    Department of Computer Science. Illinois Institute of Technology.
    http://www.iit.edu/~kbloom1/
    Ken Bloom, Mar 2, 2009
    #10
  11. On Mon, Mar 2, 2009 at 10:38 AM, Ken Bloom <> wrote:

    > The problem with the rescue modifier is that it lumps all types of errors
    > into one relatively blunt tool. A rescue(Type) modifier would really
    > help, and a ?. operator (like Groovy's) would resolve one of the most
    > common cases for a rescue modifier.


    Right, if you could do:

    obj.capitalize rescue(NoMethodError) 42

    it'd remove the debugging issue. However, this does force the
    interpreter to do a whole lot of extra work raising and rescuing an
    error unnecessarily.

    Groovy's ?. looks about right in terms of what we really want most of
    the time rescue is used as a conditional modifier.
    In the past, I've implemented this as:

    class Object
    def try(sym, *args)
    return if nil?
    send(sym, *args) if respond_to?(sym)
    end
    end

    then, you get:

    a = obj.try:)capitalize) || 42

    But there are obviously some other limitations here...

    -greg




    --
    Technical Blaag at: http://blog.majesticseacreature.com
    Non-tech stuff at: http://metametta.blogspot.com
    "Ruby Best Practices" Book now in O'Reilly Roughcuts:
    http://rubybestpractices.com
    Gregory Brown, Mar 2, 2009
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. MZ
    Replies:
    7
    Views:
    810
    Ed Mullen
    Mar 17, 2008
  2. Tilman
    Replies:
    0
    Views:
    401
    Tilman
    Mar 19, 2008
  3. rigo
    Replies:
    0
    Views:
    163
  4. Patrick Gundlach

    rub 1.8.1 and $=

    Patrick Gundlach, Jan 6, 2004, in forum: Ruby
    Replies:
    4
    Views:
    75
    Robert Klemme
    Jan 7, 2004
  5. Iñaki Baz Castillo

    Using inline "rescue" with error class

    Iñaki Baz Castillo, Mar 3, 2009, in forum: Ruby
    Replies:
    3
    Views:
    142
    Iñaki Baz Castillo
    Mar 3, 2009
Loading...

Share This Page