Project

General

Profile

Actions

Feature #7882

closed

Allow rescue/else/ensure in do..end

Added by Anonymous over 11 years ago. Updated almost 8 years ago.

Status:
Closed
Target version:
-
[ruby-core:52513]

Description

The keywords rescue, else and ensure can be used when defining methods like so:

def foo
  #
rescue
  #
else
  #
ensure
  #
end

However when using a block delimited by do..end, you must use begin..end as well:

foo do
  begin
    # ...
  rescue
    # ...
    # ...
  end
end

It would be nice to be able to drop the extra begin..end and use rescue, etc. clauses directly:

foo do
  # ...
rescue
  # ...
  # ...
end

I cannot think of any ambiguities this syntax would cause, but please correct me if I am wrong.


Related issues 3 (0 open3 closed)

Has duplicate Ruby master - Feature #11337: Allow rescue without begin inside blocksClosedmatz (Yukihiro Matsumoto)Actions
Has duplicate Ruby master - Feature #12623: rescue in blocks without begin/endClosedActions
Has duplicate Ruby master - Feature #12906: do/end blocks work with ensure/rescue/elseClosednobu (Nobuyoshi Nakada)Actions

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

I remember I've seen the same proposal.

What do you think about {} block?

foo {
  ...
rescue
  ...
}

seems odd to me a little.

Or improve do...end only?

Updated by rosenfeld (Rodrigo Rosenfeld Rosas) over 11 years ago

I don't find it that odd, Nobu, although I think most developers would tend to use do-end anyway as we usually do in Ruby when the block span multiple lines.

I like the idea very much actually.

Updated by mame (Yusuke Endoh) over 11 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

I have suggested the same proposal (in Japanese [ruby-dev:31393]).
Matz said in [ruby-dev:31423] that it is not clear (to him) whether:

loop do
  :
rescue
  :
ensure
  :
end

should behave like:

begin
  loop do
    :
  end
rescue
  :
ensure
  :
end

or:

loop do
  begin
    :
  rescue
    :
  ensure
    :
  end
end

--
Yusuke Endoh

Updated by alexeymuranov (Alexey Muranov) over 11 years ago

I've heard of a convention to use { ... } for blocks evaluated for a result and do ... end for blocks evaluated for side effects: http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc
From this point of view, there probably shouldn't be any differences in the syntax inside the two forms of blocks.

Updated by rosenfeld (Rodrigo Rosenfeld Rosas) over 11 years ago

Yusuke, I believe it should be the latter. If you want to rescue from the yielding method you have the option of doing it like this in most cases:

with_transaction do
...
rescue
...
end rescue puts 'with_transaction raised outside the yield block'

Updated by phluid61 (Matthew Kerwin) over 11 years ago

mame (Yusuke Endoh) wrote:

I have suggested the same proposal (in Japanese [ruby-dev:31393]).
Matz said in [ruby-dev:31423] that it is not clear (to him) ...

Definitely the latter. The rescue statement in the block should only rescue errors that occur inside the block. This is more apparent if you consider that:

loop do
rescue
finally
end

is equivalent to:

x = proc do
rescue
finally
end
while true
  x.call
end

Similarly replacing 'while' with a method, such as #each; the 'rescue' in the block should not expect to catch exceptions in the implementation of 'each', only the exceptions raised in the body of the block.

Updated by hsbt (Hiroshi SHIBATA) almost 11 years ago

  • Target version changed from 2.1.0 to 2.2.0
Actions #8

Updated by shyouhei (Shyouhei Urabe) over 8 years ago

  • Has duplicate Feature #11337: Allow rescue without begin inside blocks added
Actions #9

Updated by shyouhei (Shyouhei Urabe) over 8 years ago

  • Has duplicate Feature #12623: rescue in blocks without begin/end added

Updated by nobu (Nobuyoshi Nakada) about 8 years ago

  • Description updated (diff)
Actions #11

Updated by shyouhei (Shyouhei Urabe) almost 8 years ago

  • Has duplicate Feature #12906: do/end blocks work with ensure/rescue/else added

Updated by Nondv (Dmitry Non) almost 8 years ago

So... Is there any movement?

Updated by nobu (Nobuyoshi Nakada) almost 8 years ago

  • Status changed from Assigned to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0