提问人:15 Volts 提问时间:5/8/2022 更新时间:5/8/2022 访问量:202
拯救 ruby 中的所有 Errno 错误
Rescue all Errno errors in ruby
问:
我想在我的程序中抓取所有 Errno 错误,如 Errno::ENOENT、Errno::EIO、Errno::ENODEV 等,但我不想抓取其他东西——比如 ArgumentError 或 RuntimeError。
我目前的实现是这样的:
begin
raise Errno::EIO
rescue StandardError
raise $! unless $!.class.name.partition(-'::').first == -'Errno'
end
但是有没有更好的方法可以做到这一点呢?
答:
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: “ 是所有与平台相关的低级错误的基类。当前平台上可用的错误是模块的子类,并在模块中定义。SystemCallError
Errno
SystemCallError
SystemCallError
Errno
评论