Project

General

Profile

Feature #13224

Add FrozenError as a subclass of RuntimeError

Added by jeremyevans0 (Jeremy Evans) almost 3 years ago. Updated almost 2 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
[ruby-core:79581]

Description

Currently, attempting to modify a frozen object leads to a RuntimeError exception. Unfortunately, this means it is not easy to differentiate exceptions raised from attempting to modify frozen objects from generic exceptions such as calling Kernel#raise with no exception class.

The attached patch adds FrozenError as a subclass of RuntimeError, and uses FrozenError instead of RuntimeError for exceptions raised when there is an attempt to modify a frozen object. It should be backwards compatible in the sense that:

begin
  "a".freeze << b
rescue RuntimeError
end

Will still function as before.

More people in the ruby community are starting to use frozen objects for the benefits of immutability (thread-safety, cache-ability, referential transparency), and having an exception class dedicated to misuse of frozen objects will make it easier to handle those exceptions.

The attached patch is a little long, mostly because ruby's test suite is currently brittle in regards to handling exception classes. For example, assert_raise(RuntimeError) needs to be changed to assert_raise(FrozenError), because assert_raise uses instance_of? instead of kind_of? if given an exception class and not a module. Both RSpec and recent versions of Minitest should automatically handle this type of change without code modifications.


Files

0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch (27.2 KB) 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch jeremyevans0 (Jeremy Evans), 02/17/2017 11:04 PM
0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch (29 KB) 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch Updated to apply to r60182 jeremyevans0 (Jeremy Evans), 10/15/2017 02:49 AM
0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch (30 KB) 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch Updated to apply to r60924 jeremyevans0 (Jeremy Evans), 11/28/2017 05:04 AM

Associated revisions

Revision 61131
Added by shyouhei (Shyouhei Urabe) almost 2 years ago

Add FrozenError as a subclass of RuntimeError

FrozenError will be used instead of RuntimeError for exceptions
raised when there is an attempt to modify a frozen object. The
reason for this change is to differentiate exceptions related
to frozen objects from generic exceptions such as those generated
by Kernel#raise without an exception class.

From: Jeremy Evans code@jeremyevans.net
Signed-off-by: Urabe Shyouhei shyouhei@ruby-lang.org

Revision 27c7d498
Added by shyouhei (Shyouhei Urabe) almost 2 years ago

NEWS entry for FrozenError [Feature #13224]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61152 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 61152
Added by shyouhei (Shyouhei Urabe) almost 2 years ago

NEWS entry for FrozenError [Feature #13224]

Revision 61152
Added by shyouhei (Shyouhei Urabe) almost 2 years ago

NEWS entry for FrozenError [Feature #13224]

Revision 61152
Added by shyouhei (Shyouhei Urabe) almost 2 years ago

NEWS entry for FrozenError [Feature #13224]

History

#1

Updated by nobu (Nobuyoshi Nakada) over 2 years ago

  • Description updated (diff)

Updated by matz (Yukihiro Matsumoto) over 2 years ago

OK, accepted.

Matz.

Updated by jeremyevans0 (Jeremy Evans) about 2 years ago

Matz accepted this feature about 6 months ago, but it didn't make it into 2.5.0-preview1. Attached is an updated patch that applies to current trunk.

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

Out of topic, Kernel.raise in examples should be Kernel#raise, I think.

Updated by jeremyevans0 (Jeremy Evans) about 2 years ago

There's less than a month until the release of 2.5.0, and this hasn't been merged yet. I've rebased the patch to apply to current trunk and made sure the tests pass. Since this feature was already accepted back in April, I'm assigning 2.5 as the target version.

Updated by jeremyevans0 (Jeremy Evans) almost 2 years ago

Only two weeks until the release of 2.5.0, and this hasn't been merged yet. I've tested and the patch still applies and the tests still pass.

Updated by shyouhei (Shyouhei Urabe) almost 2 years ago

Sorry, I missed this patch. Applied just now.

#8

Updated by shyouhei (Shyouhei Urabe) almost 2 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r61152.


NEWS entry for FrozenError [Feature #13224]

Also available in: Atom PDF