[解決済み] ruby の rescue 節に複数のエラークラスを DRY に渡す方法
2022-09-24 21:01:18
質問
Rubyで複数の種類の例外をレスキューする必要があるコードがあります。
begin
a = rand
if a > 0.5
raise FooException
else
raise BarException
end
rescue FooException, BarException
puts "rescued!"
end
私がやりたいことは、救助したい例外タイプのリストをどうにかしてどこかに保存して、それらのタイプを救助節に渡すことです。
EXCEPTIONS = [FooException, BarException]
として、その後に
rescue EXCEPTIONS
これは可能なのでしょうか?
eval
? 私は、私が見ている
TypeError: class or module required for rescue clause
が表示されていることを考えると、期待できません。
どのように解決するのですか?
配列にスプラット演算子
*
.
EXCEPTIONS = [FooException, BarException]
begin
a = rand
if a > 0.5
raise FooException
else
raise BarException
end
rescue *EXCEPTIONS
puts "rescued!"
end
上記のように配列に定数を使用する場合、(
EXCEPTIONS
で)、定義の中では定義できないこと、また、他のクラスで定義する場合は、その名前空間で参照する必要があることに注意してください。実際には、定数である必要はありません。
スプラットオペレーター
スプラット演算子
*
というように、配列をその位置で展開します。
rescue *EXCEPTIONS
と同じ意味です。
rescue FooException, BarException
のように配列リテラル内で使用することもできます。
[BazException, *EXCEPTIONS, BangExcepion]
と同じです。
[BazException, FooException, BarException, BangExcepion]
または引数の位置で
method(BazException, *EXCEPTIONS, BangExcepion)
というのは
method(BazException, FooException, BarException, BangExcepion)
[]
は空虚に拡大する。
[a, *[], b] # => [a, b]
ruby 1.8とruby 1.9の違いのひとつは
nil
.
[a, *nil, b] # => [a, b] (ruby 1.9)
[a, *nil, b] # => [a, nil, b] (ruby 1.8)
のあるオブジェクトには注意が必要です。
to_a
が定義されているオブジェクトは
to_a
が適用されます。
[a, *{k: :v}, b] # => [a, [:k, :v], b]
他のタイプのオブジェクトでは、それ自身を返します。
[1, *2, 3] # => [1, 2, 3]
関連
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み】Rails 4 認証トークン
-
[解決済み] ...』の違い (ダブルドット) と '...' の違い?(トリプルドット)の違いについて教えてください。
-
[解決済み] 現在の日時をDD/MM/YYYY HH:MM形式で取得するにはどうすればよいですか?
-
[解決済み] key => "value"`と`key: "value"`のハッシュ表記に違いはありますか?
-
[解決済み] Rubyにおけるtapメソッドの利点
-
[解決済み] 今月の名前(Date.today.monthをnameに変換)。
-
[解決済み] RubyのREPLを開くコマンドは何ですか?
-
[解決済み] Rubyでjavaのインターフェースに相当するものは何ですか?
-
[解決済み] doブロックと中括弧{}の使い分け
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyの理想的なプロジェクト構造
-
[解決済み] Rubyでbeginとendのブロックを使わずにrescueを使うには?
-
[解決済み] Rubyオプションのパラメータ
-
[解決済み] Ubuntu 14.04にRuby 2.1.4をインストールする方法
-
[解決済み] Sinatraがファイルを変更するたびに自動で再読み込みするようにするには?
-
[解決済み] Rubyで「逆レンジ」を繰り返し処理できないのはなぜですか?
-
[解決済み] RubyのREPLを開くコマンドは何ですか?
-
[解決済み] Ruby: 文字列の最初の文字を取得する方法
-
[解決済み] doブロックと中括弧{}の使い分け
-
[解決済み] 文字列を DateTime に変換する