[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が起きるパターンはあるのでしょうか

In This Thread

Prev Next