NoException

役に立たないライブラリを作るシリーズです。

最近例外を発生させない某言語が流行ってるらしいと聞いて作ってみました。

インストール

% gem install tmtms-noexception

なんと noexception という名前は既に取られてた!

使い方

こんな風な例外を発生させるメソッドを持つクラスがあったとして、

class Foo
  def bar
    123
  end

  def abc
    raise 'abc error'
  end

  def xyz
    raise 'xyz error'
  end
end

普通にメソッドを呼ぶと例外が発生するんですけど、

foo = Foo.new
foo.bar  #=> 123
foo.abc  #=> RuntimeError: abc error

NoException::No を include すると、例外が発生する代わりに nil を返すようになります。 エラーは $error グローバル変数に入ります。

require 'noexception'

Foo.include NoException::No

foo = Foo.new
foo.bar  #=> 123
foo.abc  #=> nil
$error   #=> #<RuntimeError: abc error>

あるメソッドだけ例外を発生させないようにもできます。

Foo.include NoException::No(:abc)

foo = Foo.new
foo.bar  #=> 123
foo.abc  #=> nil
$error   #=> #<RuntimeError: abc error>
foo.xyz  #=> RuntimeError: xyz error

NoException::Go(名前は気にするな)を include すると、戻り値でエラーを返すようになります。例外が発生しない場合でも戻り値の形式が変わります。

Foo.include NoException::Go

foo = Foo.new
foo.bar  #=> [123, nil]
foo.abc  #=> [nil, #<RuntimeError: abc error>]

何の役に立つのか?

だから役に立たないんだってば!

Module#prepend を使ってみたかっただけです。すいません。