水晶检查类的列表的子类
问题描述:
所以我想要做的是检查是否引发的错误是在运行时的特定异常列表的子类。用户可以在运行时提交一个异常数组。水晶检查类的列表的子类
我以为我只是使用is_a?
,它可以像预期的那样对单个课程起作用。
class A < Exception; end
class B < A; end
class C < Exception; end
class D < Exception; end
begin
raise B.new
rescue e
puts e.is_a? A
end
但是,如果我再使用异常检查的数组,它不工作了
monitored = [A, C]
begin
raise B.new
rescue e
monitored.each do |exception_class|
puts e.is_a? exception_class
end
end
我得到的错误是Syntax error in eval:24: expecting token 'CONST', not 'exception_class'
与线24是puts e.is_a? exception_class
。
puts typeof(exception_class)
在循环中按预期打印Exception:Class
。
任何想法我在做什么错在这里?
答
显然,这是不可能的问题与当前的编译器实现上述确切情况: https://github.com/crystal-lang/crystal/issues/2060#issuecomment-309711343
答
所以我想要做的是检查是否有引发错误的列表的一个子类特定的例外。
您可以通过类型抢救:
begin
raise B.new
rescue e : A | C
puts "A or C"
rescue B
puts "B"
rescue
puts "any other kind of exception"
end
它打印
# => A or C
嗯,是啊,将工作,如果例外列表是在编译时知道的,但我想用户能够提交一个异常数组,并在运行时检查这个异常 – tpei
然后,您可以使用类名或更好的唯一ID来识别异常类型。面向用户的配置应该与内部名称解耦。 –