Project

General

Profile

Feature #10481

Add "if" and "unless" clauses to rescue statements

Added by javawizard (Alex Boyd) over 5 years ago. Updated over 5 years ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-core:66104]

Description

I'd like to propose a syntax change: allow boolean "if" and "unless" clauses to follow a rescue statement.

Consider the following:

begin
  ...
rescue SomeError => e
  if e.error_code == 1
    ...handle error...
  else
    raise
  end
end

This is a fairly common way of dealing with exceptions where some condition above and beyond the exception's type determines whether the exception should be rescued. It's verbose, though, and it's not obvious at first glance exactly what conditions are being rescued, especially if "...handle error..." is more than a few lines long. I propose that the following be allowed:

begin
  ...
rescue SomeError => e if e.error_code == 1
  ...handle error...
end

"unless" would, of course, be allowed as well:

begin
  ...
rescue SomeError => e unless e.error_code == 2
  ...handle error...
end

A rescue statement whose boolean condition failed would be treated the same as if the exception being raised didn't match the exception being rescued, and move on to the next rescue statement:

begin
  ...
rescue SomeError => e if e.error_code == 1
  ...handle error code 1...
rescue SomeError => e if e.error_code == 2
  ...handle error code 2...
end

And finally, catch-all rescue statements would be allowed as well:

begin
  ...
rescue => e if e.message == "some error"
  ...handle error...
end

Files

rescue-conditions.diff (6.76 KB) rescue-conditions.diff javawizard (Alex Boyd), 11/20/2014 12:13 PM
rescue-conditions.diff (6.57 KB) rescue-conditions.diff javawizard (Alex Boyd), 11/20/2014 12:30 PM
smime.p7s (4.78 KB) smime.p7s brianhempel (Brian Hempel), 12/04/2014 04:38 PM

Also available in: Atom PDF