Project

General

Profile

Actions

Feature #13224

closed

Add FrozenError as a subclass of RuntimeError

Added by jeremyevans0 (Jeremy Evans) about 7 years ago. Updated over 6 years ago.

Status:
Closed
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

Actions #1

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago

  • Description updated (diff)

Updated by matz (Yukihiro Matsumoto) almost 7 years ago

OK, accepted.

Matz.

Updated by jeremyevans0 (Jeremy Evans) over 6 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) over 6 years ago

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

Updated by jeremyevans0 (Jeremy Evans) over 6 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) over 6 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) over 6 years ago

Sorry, I missed this patch. Applied just now.

Actions #8

Updated by shyouhei (Shyouhei Urabe) over 6 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r61152.


NEWS entry for FrozenError [Feature #13224]

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0