Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby例外としてオブジェクトを発生させる方法

Rubyのraise構文には、発生させるエラーの種類を指定するためのいくつかのオプションがあります。以下のコードでは、RuntimeErrorを発生させる3つの方法を示しました。

raise "hello"
raise RuntimeError, "hello"
raise RuntimeError.new("hello")

# ...all of the above result in "RuntimeError: hello"

それはいいことですが、例外以外のものを発生させたい場合はどうなりますか?番号を上げたい場合はどうなりますか?まあ、Rubyは私を許可しません。次のようなエラーメッセージが表示されます:

raise 1
# TypeError: exception class/object expected

このメッセージにより、raiseは例外クラス/オブジェクトをパラメーターとして予期していると思われるかもしれません。しかし、それは正しくありません!

exceptionの紹介 メソッド

raise fooを実行する場合 raiseメソッドは、fooが例外オブジェクトであることを期待していません。 foo.exceptionを呼び出すたびに、例外オブジェクトを取得することを想定しています。 。

覚えておくべきことは、例外を返す例外と呼ばれるメソッドがある限り、レイズするために何でも渡すことができるということです。

したがって、必要に応じて、ルビーの番号クラスにモンキーパッチを適用して、番号を上げることができます。これがどのように見えるかです:

class Fixnum
  def exception
    RuntimeError.new("I'm number: #{ self }")
  end
end

raise 42
# ...results in raise_number.rb:7:in `<main>': I'm number: 42 (RuntimeError)

これはきちんとしたパーティーのトリックですが、実際の生活で役立つ可能性はありますか?この手法で私が目にする主な実用的なアプリケーションは、例外を作成するために必要なロジックを、例外を発生させることを決定するロジックから分離することです。これは確かにちょっとしたエッジケースです。しかし、それがどのように見えるか見てみましょう。

おそらく実用的な例

ある種のIOから1行のデータを読み取りたいとします。ネットワークIOの場合もあれば、ファイルの場合もあります。それは本当に重要ではありません。データを読み取って、それが有効かどうかを確認したいだけです。

読み取ったデータが有効でない場合は、例外を発生させたいと思います。ただし、例外は入力に合わせて調整する必要があります。ネットワーク接続には、ローカルファイルとは異なるデバッグ情報が必要です。これを行うには、入力クラスの種類ごとにカスタム例外メソッドを提供します。これは、それがどのように見えるかを示すいくつかの疑似ルビーです。

# These three classes represent different kinds of IO with different exceptions.
class NetworkConnection
  ...
  def exception
    NetworkConnectionError.new(url: url, ...)
  end
end

class LocalFile
  ...
  def exception
    FileError.new(path: path, ...)
  end
end

class UnixPipe
  ...
  def exception
    PipeError.new(...)
  end
end

def read_all(*items)
  items.each do |item|
    if item.readline != "foo"
      # We raise the item, which causes the appropriate exception class to be used. 
      raise item
    end
  end
end

read_all(NetworkConnection.new(url: "example.com"), LocalFile.new("/something"), UnixPipe.new)


  1. Rubyの使い方Any、All、None&One

    今日は、要素の配列、ハッシュ、またはEnumerableモジュールを含むその他のオブジェクトに対して条件ステートメントをチェックするのに役立つ4つのEnumerableメソッドについて学習します。 これらの4つのメソッドは、trueのいずれかを返します またはfalse 。 コンテンツ 1RubyAllメソッド 2つのすべての配列と空の配列 3Rubyなしメソッド 4 Ruby Any Method 5RubyOneメソッド 6つの新しいRuby2.5機能 7まとめ 7.1関連 やってみましょう! ルビーオールメソッド 配列内のすべての文字列が特定のサイズであるか

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた