拯救 ruby 中的所有 Errno 错误

Rescue all Errno errors in ruby

提问人:15 Volts 提问时间:5/8/2022 更新时间:5/8/2022 访问量:202

问:

我想在我的程序中抓取所有 Errno 错误,如 Errno::ENOENT、Errno::EIO、Errno::ENODEV 等,但我不想抓取其他东西——比如 ArgumentError 或 RuntimeError。

我目前的实现是这样的:

begin
    raise Errno::EIO
rescue StandardError
    raise $! unless $!.class.name.partition(-'::').first == -'Errno'
end

但是有没有更好的方法可以做到这一点呢?

Ruby 异常

评论


答:

2赞 Jörg W Mittag 5/8/2022 #1

您可以使用 Module#constants 检索 Errno 中定义的常量的名称,使用 Enumerable#map 循环访问它们,使用 Module#const_get 检索存储在这些常量中的类,并将这些类用作子句中的异常过滤器:rescue

begin
  raise Errno::EIO
rescue *Errno.constants(false).map(&Errno.method(:const_get)) => e
  p e
end
# #<Errno::EIO: Input/output error>

评论

0赞 engineersmnky 5/10/2022
似乎是所有异常的父级,拯救它不是更容易吗?From Docs: “ 是所有与平台相关的低级错误的基类。当前平台上可用的错误是模块的子类,并在模块中定义。SystemCallErrorErrnoSystemCallErrorSystemCallErrorErrno