Project

General

Profile

Actions

Bug #15576

closed

Wrong error message from some class methods of `Dir`

Added by takaram (Takuya Aramaki) about 5 years ago. Updated over 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
[ruby-core:91354]
Tags:

Description

When a error is raised in some class methods of Dir, the backtrace is as if the user called Dir.open.

$ ruby -e 'Dir.foreach {}'
Traceback (most recent call last):
	2: from -e:1:in `<main>'
	1: from -e:1:in `foreach'
-e:1:in `open': wrong number of arguments (given 0, expected 1) (ArgumentError)
$ ruby -e 'Dir.foreach(nil)'
Traceback (most recent call last):
	2: from -e:1:in `<main>'
	1: from -e:1:in `foreach'
-e:1:in `open': no implicit conversion of nil into String (TypeError)
$ ruby -e 'Dir.foreach("not_exist")'
Traceback (most recent call last):
	2: from -e:1:in `<main>'
	1: from -e:1:in `foreach'
-e:1:in `open': No such file or directory @ dir_initialize - not_exist (Errno::ENOENT)

The last line of the error message should be -e:1:in `foreach': ... like IO.foreach

This occurs in following methods:

  • Dir.foreach
  • Dir.entries
  • Dir.each_child
  • Dir.children

Updated by nobu (Nobuyoshi Nakada) about 5 years ago

It is expected as these methods delegate to Dir.open.
So you can redefine the open method.

$ ruby -e 'def Dir.open(*)raise "boom";end; Dir.foreach("."){}'
Traceback (most recent call last):
	2: from -e:1:in `<main>'
	1: from -e:1:in `foreach'
-e:1:in `open': boom (RuntimeError)

whereas IO.foreach can't.

Updated by nobu (Nobuyoshi Nakada) about 5 years ago

I'm not sure this difference between IO and Dir is intentional.

Actions #3

Updated by jeremyevans0 (Jeremy Evans) over 3 years ago

  • Status changed from Open to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0