[#107430] [Ruby master Feature#18566] Merge `io-wait` gem into core IO — "byroot (Jean Boussier)" <noreply@...>

Issue #18566 has been reported by byroot (Jean Boussier).

22 messages 2022/02/02

[#107434] [Ruby master Bug#18567] Depending on default gems when not needed considered harmful — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18567 has been reported by Eregon (Benoit Daloze).

31 messages 2022/02/02

[#107443] [Ruby master Feature#18568] Explore lazy RubyGems boot to reduce need for --disable-gems — "headius (Charles Nutter)" <noreply@...>

Issue #18568 has been reported by headius (Charles Nutter).

13 messages 2022/02/02

[#107481] [Ruby master Feature#18571] Removed the bundled sources from release package after Ruby 3.2 — "hsbt (Hiroshi SHIBATA)" <noreply@...>

Issue #18571 has been reported by hsbt (Hiroshi SHIBATA).

9 messages 2022/02/04

[#107490] [Ruby master Bug#18572] Performance regression when invoking refined methods — "palkan (Vladimir Dementyev)" <noreply@...>

Issue #18572 has been reported by palkan (Vladimir Dementyev).

12 messages 2022/02/05

[#107514] [Ruby master Feature#18576] Rename `ASCII-8BIT` encoding to `BINARY` — "byroot (Jean Boussier)" <noreply@...>

Issue #18576 has been reported by byroot (Jean Boussier).

47 messages 2022/02/08

[#107536] [Ruby master Feature#18579] Concatenation of ASCII-8BIT strings shouldn't behave differently depending on string contents — "tenderlovemaking (Aaron Patterson)" <noreply@...>

Issue #18579 has been reported by tenderlovemaking (Aaron Patterson).

11 messages 2022/02/09

[#107547] [Ruby master Bug#18580] Range#include? inconsistency for String ranges — "zverok (Victor Shepelev)" <noreply@...>

Issue #18580 has been reported by zverok (Victor Shepelev).

10 messages 2022/02/10

[#107603] [Ruby master Feature#18589] Finer-grained constant invalidation — "kddeisz (Kevin Newton)" <noreply@...>

Issue #18589 has been reported by kddeisz (Kevin Newton).

17 messages 2022/02/16

[#107624] [Ruby master Bug#18590] String#downcase and CAPITAL LETTER I WITH DOT ABOVE — "andrykonchin (Andrew Konchin)" <noreply@...>

Issue #18590 has been reported by andrykonchin (Andrew Konchin).

13 messages 2022/02/17

[#107651] [Ruby master Misc#18591] DevMeeting-2022-03-17 — "mame (Yusuke Endoh)" <noreply@...>

Issue #18591 has been reported by mame (Yusuke Endoh).

11 messages 2022/02/18

[#107682] [Ruby master Feature#18595] Alias `String#-@` as `String#dedup` — "byroot (Jean Boussier)" <noreply@...>

Issue #18595 has been reported by byroot (Jean Boussier).

15 messages 2022/02/21

[#107699] [Ruby master Feature#18597] Strings need a named method like `dup` that doesn't duplicate if receiver is mutable — "danh337 (Dan H)" <noreply@...>

Issue #18597 has been reported by danh337 (Dan H).

18 messages 2022/02/21

[ruby-core:107417] [Ruby master Feature#18564] Add Exception#detailed_message

From: "mame (Yusuke Endoh)" <noreply@...>
Date: 2022-02-01 19:49:25 UTC
List: ruby-core #107417
Issue #18564 has been reported by mame (Yusuke Endoh).

----------------------------------------
Feature #18564: Add Exception#detailed_message
https://bugs.ruby-lang.org/issues/18564

* Author: mame (Yusuke Endoh)
* Status: Open
* Priority: Normal
* Assignee: mame (Yusuke Endoh)
----------------------------------------
(This ticket is for recording the final spec of #18438)

## Proposal

I would introduce a method `Exception#detailed_message`, and let the default error printer use it instead of `Exception#message` to create a error output.

```
class MyClass < StandardError
  def message = "my error!"
  def detailed_message(highlight: false, **opt)
    super + "\nThis is\nan additional\nmessage"
  end
end

raise MyClass
```

```
$ ./miniruby test.rb
test.rb:8:in `<main>': my error! (MyClass)
This is
an additional
message
```

Here is the implementation: https://github.com/ruby/ruby/pull/5516

## Spec

`Exception#detailed_message(highlight: false)` calls `#message` and decorates the returned string. It may add the class name of exception and, when `highlight` keyword is true, some escape sequences for highlights.

```
e = RuntimeError.new("my error!")
p e.detailed_message                  #=> "my error! (RuntimeError)"
p e.detailed_message(highlight: true) #=> "\e[1mmy error! (\e[1;4mRuntimeError\e[m\e[1m)\e[m"
```

Previously, the default error printer and `Exception#full_message` called `#message` to get the error message, applied some processing (adding the error class name and adding escape sequences) to the string, and added backtrace. Now, they now use `#detailed_message(highlight: Exception.to_tty?)` instead of `#message`.

All keyword arguments passed to `Exception#full_message` are delegated to `detailed_message`.

## Motivation

The primary motivation is a clean integration of did_you_mean and error_highlight gems.

At the present time, they overrides `Exception#to_s` to add their suggestions. However, there are some known problems in this approach:

* It may break some tests to check the result of `Exception#to_s` depending on whether the gems add suggestions or not.
* Some Ruby scripts re-raise an exception by `raise e.class, e.message, e.backtrace`, which makes the gems add their suggestion multiple times (currently, [the gems ad-hocly check and avoid multiple addition](https://github.com/ruby/did_you_mean/blob/531760f323df8d43a7017af5a3052f20e8a03fda/lib/did_you_mean/core_ext/name_error.rb#L18)).
* Sometimes a user needs to get the original message without their addition. For the sake, did_you_mean provides `Exception#original_message`, but [the workaround is not very well known](https://github.com/ruby/error_highlight/pull/10).

This proposal allows the gems to override `Exception#detailed_message`. `Exception#to_s` is kept as-is, so the above problems will no longer occur.

Also, the proposal allows a user to get a full_message without the suggestions by `err.full_message(did_you_mean: false, error_highlight: false)`.

Here is a proof-of-concept patch for did_you_mean and error_highlight: https://gist.github.com/mame/2c34230f11237dc4af64510cb98acdd8 I'll create PRs for the gems after `Exception#detailed_message` is merged.

# Cooperation needed

This change requires application monitoring services such as Sentry, DataDog, ScoutAPM, etc. Thankfully, @st0012 (the maintainer of Sentry's Ruby SDK) and @ivoanjo and @marcotc (the maintainers of Datadog's application monitoring gem) have agreed with this change.

https://bugs.ruby-lang.org/issues/18438#note-1
https://bugs.ruby-lang.org/issues/18438#note-9

@matz has already approved this proposal in #18438 . I'll merge my PR in a few days after some reviews.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next