役に立たないライブラリを作るシリーズです。
最近例外を発生させない某言語が流行ってるらしいと聞いて作ってみました。
インストール
% 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
を使ってみたかっただけです。すいません。