Passing multiple error classes to ruby's rescue clause in a DRY fashion
我有一些代码需要在ruby中拯救多种类型的异常:
1 2 3 4 5 6 7 8 9 10 | begin a = rand if a > 0.5 raise FooException else raise BarException end rescue FooException, BarException puts"rescued!" end |
我想要做的是以某种方式存储我想要在某处救援的异常类型列表,并将这些类型传递给rescue子句:
1 | EXCEPTIONS = [FooException, BarException] |
然后:
1 | rescue EXCEPTIONS |
这甚至是可能的,如果没有对
您可以使用splat运算符
1 2 3 4 5 6 7 8 9 10 11 12 | EXCEPTIONS = [FooException, BarException] begin a = rand if a > 0.5 raise FooException else raise BarException end rescue *EXCEPTIONS puts"rescued!" end |
如果您要使用上面的数组常量(使用
Splat操作员
splat运算符
1 | rescue *EXCEPTIONS |
意思是一样的
1 | rescue FooException, BarException |
您也可以在数组文字中使用它
1 | [BazException, *EXCEPTIONS, BangExcepion] |
这是一样的
1 | [BazException, FooException, BarException, BangExcepion] |
或者在争论的位置
1 | method(BazException, *EXCEPTIONS, BangExcepion) |
意思是
1 | method(BazException, FooException, BarException, BangExcepion) |
1 | [a, *[], b] # => [a, b] |
ruby 1.8和ruby 1.9之间的一个区别是
1 2 | [a, *nil, b] # => [a, b] (ruby 1.9) [a, *nil, b] # => [a, nil, b] (ruby 1.8) |
注意定义
1 | [a, *{k: :v}, b] # => [a, [:k, :v], b] |
对于其他类型的对象,它返回自身。
1 | [1, *2, 3] # => [1, 2, 3] |
我刚遇到这个问题并找到了另一种解决方案。如果你的
例如,我有三个例外:
像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class FileLoadError < StandardError end class FileNamesMissingError < FileLoadError end class InputFileMissingError < FileLoadError end class OutputDirectoryError < FileLoadError end [FileNamesMissingError, InputFileMissingError, OutputDirectoryError].each do |error| begin raise error rescue FileLoadError => e puts"Rescuing #{e.class}." end end |