Actions
Bug #13564
closedException message management
Bug #13564:
Exception message management
Description
We can modify Exception#message if given String is not frozen.
Should we continue this specification?
Now, we can modify exception message with message string modification.
However, if we pass frozen string, it is not allowed.
begin
raise 'foo'.freeze
ensure
$!.message.replace 'bar' #=> `replace': can't modify frozen String (RuntimeError)
end
Furthermore, # frozen_string_literal: true freeze all of string literals.
# frozen_string_literal: true
begin
raise 'foo'
ensure
$!.message.replace 'bar' #=> `replace': can't modify frozen String (RuntimeError)
end
Background and motivation¶
I want to add Exception message on ensure clause like the code in previous section. Just now, we need to re-raise another exception (with raise($!.class, new_msg, $!.backtrace)). I tried to modify $!.message and it works on small script. However, I try it on production (*1), it doesn't work because of frozen_string_literal: true.
I think current behavior (specification?) is easy to misusing.
Ideas¶
- (1) To prevent such behavior
- (1-1) Freeze message strings at initialize
- (1-2) Return copy string at
Exception#message
- (2) Provide
Exception#message =- And (1-1) or (1-2)
- (3) Allow such behavior. If a frozen message is given, dup it and set as modifiable.
Actions