Project

General

Profile

Actions

Feature #19978

closed

NoMethodError and large objects should not create unwieldy error messages

Added by ConorOBR (Conor O'Brien) about 1 year ago. Updated about 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:115190]

Description

Description

Currently, in the error message for NoMethodError, the object in question is inspected and displayed to the user. This results in unwieldy error messages for large objects. This comes up most often for me when working with large hashes, but in principal it affects any object with an inspect method which can produce large output.

Reproduce

There are many ways to reproduce this, but here is one. (Scales with the size of the object, so this gets out of hand quickly with, say, 1e7 as the upperbound.)

(1..1e3).to_a/=3

ruby -v

ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mingw-ucrt]

Desired Behavior

Some kind of elision, e.g., for the above, the desired output could be something like

-e:1:in `<main>': undefined method `/' for [1, 2, 3, ..., 998, 999, 1000]:Array (NoMethodError)

(1..1e3).to_a/=3
             ^

At the very least, not showing the entire object (even if that means showing none of it) if the inspect exceeds a certain length would be preferable.


Related issues 1 (0 open1 closed)

Is duplicate of Ruby master - Feature #18285: NoMethodError#message uses a lot of CPU/is really expensive to callClosedActions

Updated by sawa (Tsuyoshi Sawada) about 1 year ago

Do you intend the elided inspect form to be defined for each class, or should it be a result of simple string ellipsis on a fully expanded inspect string (e.g., take the first ten and last seventeen characters from inspection, as in your example)? The arbitrary choice of taking seventeen characters from the end seems to be suggesting the intention is rather the former, but your description in the end "... if the inspect exceeds a certain length ..." seems to be suggesting the latter. It is not clear which.

If you intend the former, the implementation is not going to be trivial.

Updated by sawa (Tsuyoshi Sawada) about 1 year ago

If displaying the instance is not important for a NoMethodError, then getting rid of it entirely may make it simpler.

-e:1:in `<main>': undefined method `/' for Array instance (NoMethodError)

(1..1e3).to_a/=3
             ^
Actions #3

Updated by mame (Yusuke Endoh) about 1 year ago

  • Is duplicate of Feature #18285: NoMethodError#message uses a lot of CPU/is really expensive to call added

Updated by mame (Yusuke Endoh) about 1 year ago

  • Status changed from Open to Closed

The behavior will be changed at Ruby 3.3. See #18285.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0