From: alex@... Date: 2014-11-22T08:59:36+00:00 Subject: [ruby-core:66412] [ruby-trunk - Feature #10481] Add "if" and "unless" clauses to rescue statements Issue #10481 has been updated by Alex Boyd. Awesome, thanks! I was having trouble building trunk on OS X, so (I believe) I based it off of 2.1.5. Quite a bit more's changed than I had anticipated. Thanks for writing up tests as well! ---------------------------------------- Feature #10481: Add "if" and "unless" clauses to rescue statements https://bugs.ruby-lang.org/issues/10481#change-50049 * Author: Alex Boyd * Status: Assigned * Priority: Normal * Assignee: Yukihiro Matsumoto * Category: * Target version: ---------------------------------------- I'd like to propose a syntax change: allow boolean "if" and "unless" clauses to follow a rescue statement. Consider the following: ~~~ruby 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: ~~~ruby begin ... rescue SomeError => e if e.error_code == 1 ...handle error... end ~~~ "unless" would, of course, be allowed as well: ~~~ruby 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: ~~~ruby 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: ~~~ruby begin ... rescue => e if e.message == "some error" ...handle error... end ~~~ ---Files-------------------------------- rescue-conditions.diff (6.76 KB) rescue-conditions.diff (6.57 KB) -- https://bugs.ruby-lang.org/