Using "rescue" inline

Hi, is it correct the following “rescue” usage?

myvar = 1 # Fixnum
othervar = myvar.downcase rescue myvar
=> 1

It seems to work, but is it really correct? Thanks.

Iñaki Baz C. [email protected] writes:

Hi, is it correct the following “rescue” usage?

myvar = 1 # Fixnum
othervar = myvar.downcase rescue myvar
=> 1

It seems to work, but is it really correct? Thanks.

Naturally, “correctness” depends on what you’re trying to
accomplish. That is one valid use of rescue as a statement modifier
which will assign the value of myvar.downcase to othervar unless the
downcase method raises an exception, in which case it will assign
myvar instead. You can also use more than one rescue as in:

x = foo(y) rescue bar(y) rescue baz(y) rescue nil

Iñaki Baz C. wrote:

Hi, is it correct the following “rescue” usage?

myvar = 1 # Fixnum
othervar = myvar.downcase rescue myvar
=> 1

It seems to work, but is it really correct? Thanks.

Yes. What you have written is shorthand form of rescue, equivalent to:

myvar = 1
othervar = begin
myvar.downcase
rescue StandardError
myvar
end

Brian A. wrote:

Naturally, “correctness” depends on what you’re trying to
accomplish.

LOL
That’s really a good one (in addition to the valuable Ruby answer).

H.

On Feb 25, 2009, at 12:11 PM, Iñaki Baz C. wrote:

[email protected]
Hmm, “correct”? Well, it is certainly legal syntax and is equivalent to:

othervar = begin
myvar.downcase
rescue
myvar
end

But, it might not be the best way to shave the yak.

othervar = myvar.respond_to?(:downcase) ? myvar.downcase : myvar

might perform better if the exception to be rescued is expensive to
construct only to then be thrown away. (I don’t know if there’s any
special optimization of the expression form of rescue compared to the
block form.)

It also can hide problems that you won’t know that you have. For
example,
myvar = nil
othervar = myvar.downcase rescue myvar
Did you want to set othervar to nil also?
Perhaps you need othervar as a downcased String? Maybe it would be
better as:
othervar = myvar.to_s.downcase

In any case, you’d have to decide.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

El Miércoles, 25 de Febrero de 2009, Rob B.
escribió:

othervar = myvar.respond_to?(:downcase) ? myvar.downcase : myvar

might perform better if the exception to be rescued is expensive to
construct only to then be thrown away. (I don’t know if there’s any
special optimization of the expression form of rescue compared to the
block form.)

Really good point. But I’ve done some benchmarks comparing both
approache and
using “rescue” is ~ 0.30e-5 faster than your approach (even if yours
seems
more ellegant to me).

It also can hide problems that you won’t know that you have. For
example,
myvar = nil
othervar = myvar.downcase rescue myvar
Did you want to set othervar to nil also?

Not exactly, but myvar could be a Fixnum so othervar would also be a
Fixnum.
But if myvar is a String then I want othervar to be the same String but
downcase.

Thanks a lot.

On Thu, Feb 26, 2009 at 1:24 AM, Iñaki Baz C. [email protected] wrote:

It also can hide problems that you won’t know that you have. For
example,
myvar = nil
othervar = myvar.downcase rescue myvar
Did you want to set othervar to nil also?

Not exactly, but myvar could be a Fixnum so othervar would also be a Fixnum.
But if myvar is a String then I want othervar to be the same String but
downcase.

This may be stating the obvious but code that branches based on type
is smelly. That is not to say it’s always wrong, just always at least
a little smelly :). Particularly if you find multiple places in the
code having to deal with Fixnum and String conditionally.

The inline rescue slightly obscures the conditional but the smell
remains. It may be worthwhile reconsidering whether you really want
myvar to hold disparate types.

I would also reiterate Rob’s concern that this rescue could easily
hide some unrelated bug (mvay being nil being the most obvious).

These two concerns would be enough for me to reconsider, but as usual,
it all depends on context.

Cheers,
lasitha

On Feb 25, 2009, at 2:54 PM, Iñaki Baz C. wrote:

using “rescue” is ~ 0.30e-5 faster than your approach (even if yours
seems
more ellegant to me).

It depends on how often myvar.downcase raises an exception. If that’s
really an exceptional occurrence, then just rescuing the occasional
failure is the Ruby way.

downcase.

Thanks a lot.

Iñaki Baz C.

de nada

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

2009/2/26 lasitha [email protected]:

hide some unrelated bug (mvay being nil being the most obvious).

These two concerns would be enough for me to reconsider, but as usual,
it all depends on context.

Yes, you are right, I’ll consider it. Thanks a lot.