Crystal 检查 类 列表的子类

Crystal check if subclass of list of classes

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

我想我只需要使用 is_a? 并且它可以按预期对付单个 class。

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

so what I want to do is check if a raised error is a subclass of a list of specific Exceptions.

您可以按类型救援:

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