水晶检查类的列表的子类

问题描述:

所以我想要做的是检查是否引发的错误是在运行时的特定异常列表的子类。用户可以在运行时提交一个异常数组。水晶检查类的列表的子类

我以为我只是使用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 
+0

嗯,是啊,将工作,如果例外列表是在编译时知道的,但我想用户能够提交一个异常数组,并在运行时检查这个异常 – tpei

+0

然后,您可以使用类名或更好的唯一ID来识别异常类型。面向用户的配置应该与内部名称解耦。 –