[ruby-core:114501] [Ruby master Bug#19849] Requiring file with autoload results in confusing error if file doesn't exist

Issue #19849 has been reported by p8 (Petrik de Heus). ---------------------------------------- Bug #19849: Requiring file with autoload results in confusing error if file doesn't exist https://bugs.ruby-lang.org/issues/19849 * Author: p8 (Petrik de Heus) * Status: Open * Priority: Normal * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Given the following file: ```ruby # example.rb require_relative 'autoload_example.rb' Example.new ``` and the constant `Example` is defined using autoload, with an unknown path: ```ruby # autoload_example.rb autoload "Example", "path_unknown" ``` Running `ruby example.rb` results in the following error: ``` <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- path_unknown (LoadError) from <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from example.rb:1:in `<main>' ``` The error is somewhat confusing as it doesn't show the location of the `autoload` which caused the error. -- https://bugs.ruby-lang.org/

Issue #19849 has been updated by Eregon (Benoit Daloze). It cannot be part of the backtrace, because that line is executed way before and not when autoloading the constant. It could maybe be part of the error message, but that might be weird and also quite difficult, because autoloading calls `require` and that might be overridden, so it's hard to pass that state from autoloading to require and know to which require call it should apply. ---------------------------------------- Feature #19849: Requiring file with autoload results in confusing error if file doesn't exist https://bugs.ruby-lang.org/issues/19849#change-104381 * Author: p8 (Petrik de Heus) * Status: Open * Priority: Normal ---------------------------------------- Given the following file that calls the `Example` constant: ```ruby # example.rb require_relative 'autoload_example.rb' Example.new ``` and an autoload to define the `Example` constant, with an unknown path: ```ruby # autoload_example.rb autoload "Example", "path_unknown" ``` Running `ruby example.rb` results in the following error: ``` <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- path_unknown (LoadError) from <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from example.rb:1:in `<main>' ``` The error is somewhat confusing as it doesn't show the location of the `autoload` which caused the error. This can be especially confusing if the autoload is called somewhere deep in a gem. -- https://bugs.ruby-lang.org/

Issue #19849 has been updated by mame (Yusuke Endoh). Briefly discussed at the dev meeting. We understand the problem, but doesn't find a good solution. Since the call line of autoload does not exist in the call stack when the exception occurs, it cannot be displayed as a backtrace. It may be possible to include it in an error message or `Exception#cause`. If there are specific suggestions on how to actually implement it and how to display it, it could be considered. ---------------------------------------- Feature #19849: Requiring file with autoload results in confusing error if file doesn't exist https://bugs.ruby-lang.org/issues/19849#change-104593 * Author: p8 (Petrik de Heus) * Status: Open * Priority: Normal ---------------------------------------- Given the following file that calls the `Example` constant: ```ruby # example.rb require_relative 'autoload_example.rb' Example.new ``` and an autoload to define the `Example` constant, with an unknown path: ```ruby # autoload_example.rb autoload "Example", "path_unknown" ``` Running `ruby example.rb` results in the following error: ``` <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- path_unknown (LoadError) from <internal:~/.rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from example.rb:4:in `<main>' ``` The error is somewhat confusing as it doesn't show the location of the `autoload` which caused the error. This can be especially confusing if the autoload is called somewhere deep in a gem. -- https://bugs.ruby-lang.org/
participants (3)
-
Eregon (Benoit Daloze)
-
mame (Yusuke Endoh)
-
p8 (Petrik de Heus)