Feature #13224
closedAdd FrozenError as a subclass of RuntimeError
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
Updated by matz (Yukihiro Matsumoto) over 7 years ago
OK, accepted.
Matz.
Updated by jeremyevans0 (Jeremy Evans) about 7 years ago
- File 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch added
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 7 years ago
Out of topic, Kernel.raise
in examples should be Kernel#raise
, I think.
Updated by jeremyevans0 (Jeremy Evans) almost 7 years ago
- File 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch 0001-Add-FrozenError-as-a-subclass-of-RuntimeError.patch added
- Target version set to 2.5
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 7 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 7 years ago
Sorry, I missed this patch. Applied just now.
Updated by shyouhei (Shyouhei Urabe) almost 7 years ago
- Status changed from Open to Closed