[ruby-list:50787] Re: クラス内での例外処理について
From:
"Masa Sakano" <imagine@...>
Date:
2019-06-17 17:26:15 UTC
List:
ruby-list #50787
坂野正明です。
私自身は、class 構文で rescue
を使ったことはありません(し、開発の裏話も全く存じません)が、使うと便利な場合があることは想像できます。
Rubyのクラスは動的に定義可能です。また、入れ子にすることも可能です。したがって、あるclassの実際の定義は、実行時に変化することがあり得ます。
例えば、以下のような定義がファイル myclass.rb
にあったとします。
class CustomError < StandardError
end
class MyClass
def initialize
end
raise CustomError if ! $stdin.closed?
def a
end
def b
end
rescue CustomError
warn 'Methods a, b are undefined.'
end
他のコードからこの myclass.rb を require
した時、その段階で $stdin が close
されている場合に限って、クラス MyClass
には、メソッド a, b が定義されます。逆に $stdin が
close されていない場合は、MyClassのメソッド a, b
の定義文がまとめてスキップされます。つまり、メソッド
a, b が定義されません。もし、rescue
文を使わずにこれらの定義を一つのファイル内で記述しようとすれば、巨大な
if 文を書くことになります。
参考までに、挙動の確認は、例えば以下
p MyClass.new.methods.grep(/^[ab]$/)
でできます。
そのどちらが良いかは、状況次第、codingポリシー次第でしょうが。
以上、私が思いついたケースでした。
坂野正明
On 17 Jun 2019, at 17:00, Akret Node wrote:
> のぐちです。
>
> クラスを定義するときに rescue
> が次のようにかけると最近知りました。
> https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#class
>
> class SuperNova
>
> rescue RuntimeError
>
> end
>
> メソッドで例外処理を書くのはよくあるパターン(?)かと思うのですが、
> このような文法を許すのはどういったメリットがあるのでしょうか?
> クラスはあくまで定義を書くところで実行してRuntimeErrorが起きるパターンはあるのでしょうか