Issue #15576 has been updated by nobu (Nobuyoshi Nakada).


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.

----------------------------------------
Bug #15576: Wrong error message from some class methods of `Dir`
https://bugs.ruby-lang.org/issues/15576#change-76616

* Author: takaram (Takuya Aramaki)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
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`



-- 
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>