From: matz@... Date: 2017-07-14T09:01:47+00:00 Subject: [ruby-core:82060] [Ruby trunk Bug#13564] Exception message management Issue #13564 has been updated by matz (Yukihiro Matsumoto). I understand the principle. But I think it's a programmer's fault to modify the string. I don't think it's worth prohibiting (and making implementation more complex). Matz. ---------------------------------------- Bug #13564: Exception message management https://bugs.ruby-lang.org/issues/13564#change-65791 * Author: ko1 (Koichi Sasada) * Status: Open * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * Target version: * ruby -v: * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- 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. ``` begin raise 'foo' ensure $!.message.replace 'bar' #=> Exception with message "bar" end ``` 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`. *1: https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rubygems/test_gem_gem_runner.rb?r1=58723&r2=58722&pathrev=58723 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. -- https://bugs.ruby-lang.org/ Unsubscribe: