[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Matz: can we have rescue/else/ensure available in all blocks?

coderrr

5/15/2008 10:03:00 PM

Hi Matz,

I recently posted a Ruby 1.9 wishlist (http://groups.google....
ruby-talk-google/browse_thread/thread/d771ffa9fe10b811/
c8b5b0b02bd1e2d4) and the #1 item was to have rescue/else/ensure
available in all blocks w/o the need for begin/end. It turned out to
be the one thing that everyone agreed on. I think anyone who has done
a real project in Ruby has run into this.

Is there any way you can get this in 1.9?

This (contrived example):

pages.each do |page|
page.links.each do |link|
process link
rescue MalformedLinkError
@bad_links << link
end
rescue MalformedPageError
@bad_pages << page
end

Is so much nicer than this:

pages.each do |page|
begin
page.links.each do |link|
begin
process link
rescue MalformedLinkError
@bad_links << link
end
end
rescue MalformedPageError
@bad_pages << page
end
end

It would make all our lives better! :]

- steve
http://coderrr.wor...

10 Answers

Phlip

5/16/2008 1:06:00 AM

0

> pages.each do |page|
> page.links.each do |link|
> process link
> rescue MalformedLinkError
> @bad_links << link
> end
> rescue MalformedPageError
> @bad_pages << page
> end

We have this, right?

pages.each do |page|
page.links.each do |link|
process link rescue @bad_links << link # MalformedLinkError
end
rescue MalformedPageError
@bad_pages << page
end

Now, what to do about the comment? Can a statement-modifying rescue
bind by type?

Peter Jones

5/16/2008 1:30:00 AM

0

coderrr <coderrr.contact@gmail.com> writes:
> pages.each do |page|
> begin
> page.links.each do |link|
> begin
> process link
> rescue MalformedLinkError
> @bad_links << link
> end
> end
> rescue MalformedPageError
> @bad_pages << page
> end
> end

If you write code that looks like that, maybe you should give Java a
second look ;)

Seriously though, you could easily restructure your code to be a bit
more OO and then you wouldn't have to worry about rescuing exceptions
all over the place, including several times in nested loops.

--
Peter Jones [pjones at domain below]
pmade inc. - http:/...

coderrr

5/16/2008 2:53:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

>
> If you write code that looks like that, maybe you should give Java a
> second look ;)
>
> Seriously though, you could easily restructure your code to be a bit
> more OO and then you wouldn't have to worry about rescuing exceptions
> all over the place, including several times in nested loops.
>

It was a contrived example. So would that be a "not in favor of" from you
Peter?

- steve
http://coderrr.wor...

Michael Neumann

5/16/2008 10:11:00 AM

0

coderrr wrote:
>> If you write code that looks like that, maybe you should give Java a
>> second look ;)
>>
>> Seriously though, you could easily restructure your code to be a bit
>> more OO and then you wouldn't have to worry about rescuing exceptions
>> all over the place, including several times in nested loops.
>>
>
> It was a contrived example. So would that be a "not in favor of"
from you
> Peter?

How would you have "rescue" and "ensure" blocks when using "{" and "}",
both of which are (almost) equivalent to "do" and "end"?

pages.each {|page|
...
}

Regards,

Michael


Peter Jones

5/16/2008 2:41:00 PM

0

coderrr <coderrr.contact@gmail.com> writes:
> It was a contrived example. So would that be a "not in favor of" from you
> Peter?

I'm certainly not convinced. Maybe you could post a more real world
example because I'm having a hard time seeing the usefulness in nested
rescues.

--
Peter Jones [pjones at domain below]
pmade inc. - http:/...

coderrr

5/16/2008 11:32:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

> How would you have "rescue" and "ensure" blocks when using "{" and "}",
> both of which are (almost) equivalent to "do" and "end"?
>
> pages.each {|page|
> ...
> }
>
>
pages.each { |page|
rescue SomeError
...
ensure
...
}

Or you could just not allow it for { }, only for do/end. I agree it looks
weird, and is probably more confusing when using it with { }.

- steve
http://coderrr.wor...

coderrr

5/17/2008 12:05:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

> I'm certainly not convinced. Maybe you could post a more real world
> example because I'm having a hard time seeing the usefulness in nested
> rescues.
>
>
This has nothing to do with nested rescues. I merely used that in the
example to make it more compelling, although I guess for you it did the
opposite :P

Here's how you can get some real world examples:
cat > findem.rb <<EOF
ARGV.each do |fn|
data = File.read(fn)
ms = data.scan(%r{
do \s* (?:\| [^|]* \|)+ \s*
begin
(?:(?!end).)+?
end \s*
end
}mx)

if ! ms.empty?
puts fn
ms.each{|m| puts m }
end
end
EOF

find /usr/lib/ruby/gems/1.8/gems -name "*.rb" | xargs ruby findem.rb >
the_real_world

for me:
grep \\.rb the_real_world | wc -l
=> 43

- steve
http://coderrr.wor...

coderrr

5/17/2008 12:09:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

> do \s* (?:\| [^|]* \|)+ \s*


sorry, this line should read:

do \s* (?:\| [^|]* \|)? \s*

after that, I get 67 results instead of 43

- steve
http://coderrr.wor...

Peter Jones

5/17/2008 1:38:00 AM

0

coderrr <coderrr.contact@gmail.com> writes:
> find /usr/lib/ruby/gems/1.8/gems -name "*.rb" | xargs ruby findem.rb >
> the_real_world

Ah, now I know why. I ran this on ~/ and it only showed lines in a
few gems that I happened to have lying around, but nothing in my code.

I guess it's just not an idiom that I use. That might be because my
background, I tend to use exceptions most often for situations that
can't be recovered from.

I'm not suggesting that you do, but I know a lot of people use
exceptions as high-level flow control, which I find disturbing.

Thanks for the code searcher.

--
Peter Jones [pjones at domain below]
pmade inc. - http:/...

coderrr

5/17/2008 5:46:00 AM

0

btw, that script _will_ give some false positives when there are other
blocks/ifs/whiles inside the block in question but for me those made
up less than 5% of the results

- steve
http://coderrr.wor...