From: "mame (Yusuke Endoh)" Date: 2022-01-31T14:58:42+00:00 Subject: [ruby-core:107391] [Ruby master Feature#18370] Call Exception#full_message to print exceptions reaching the top-level Issue #18370 has been updated by mame (Yusuke Endoh). I have given it a try, but I faced two non-trivial test failures. One is TestException#test_cause_exception_in_cause_message. https://github.com/ruby/ruby/blob/b01657c4707eadd9de9573ce9818d0b5f0fe3047/test/ruby/test_exception.rb#L917-L935 The test raises an exception whose "cause" has a broken to_s. The current error printer first outputs an error message successfully, and then attempts to output "cause", which fails due to the broken "to_s". Because it is impossible to get "full_message" from this exception, a naive approach to make the error printer use "full_message" shows nothing, which is not very useful. If we keep the current incremental error printer, we cannot save code duplication. The other is TestException#test_output_string_encoding. https://github.com/ruby/ruby/blob/b01657c4707eadd9de9573ce9818d0b5f0fe3047/test/ruby/test_exception.rb#L941-L952 The current `Exception#full_message` returns an ASCII-8BIT string. When the encodings of the full_message and `$stderr` is incompatible, writing the string to `$stderr` fails. I'm unsure if it is trivial to restore the encoding to it. I'll first put effort on the implementation of detailed_message #18438 ---------------------------------------- Feature #18370: Call Exception#full_message to print exceptions reaching the top-level https://bugs.ruby-lang.org/issues/18370#change-96294 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal ---------------------------------------- Extracted from https://bugs.ruby-lang.org/issues/18296#note-6. I think this a clear gain to improve consistency in how exceptions are shown, and it also makes it easier to evolve exception formatting in the future. It would also solve https://bugs.ruby-lang.org/issues/18367. https://bugs.ruby-lang.org/issues/18296#note-7 has more specifics, I'll copy here for convenience: mame (Yusuke Endoh) wrote in #note-6: > Does this proposal include that the ruby interpreter should use `#full_message` to show the error information? This is an incompatibility, is it acceptable? Yes, let's fix that. I don't think there is much if any compatibility issue here. The output of the uncaught exception handler is already the same as the default Exception#full_message AFAIK, let's actually call it. TruffleRuby already calls `exc.full_message` for the uncaught exception handler. If the custom `exc.full_message` raises an exception, then it's best to report that exception *and* the original exception using the default `Exception#full_message` (written in C). This is the current TruffleRuby output for that case and I think it's clear: ``` $ ruby -e 'class Foo < Exception; def full_message(**); raise "bar"; end; end; raise Foo, "message"' Error while formatting Ruby exception: -e:1:in `full_message': bar (RuntimeError) from core/truffle/exception_operations.rb:183:in `get_formatted_backtrace' Original Ruby exception: -e:1:in `
': message (Foo) ``` -- https://bugs.ruby-lang.org/ Unsubscribe: