Rubyでgemの依存が解決できない例外の時にメッセージを出す

たぶん基本的なことですが、恥ずかしながら少しずつ勉強しております。

gemの依存が解決できない場合に例外が出る

たとえば、xcodeprojというライブラリに依存するスクリプトを書こうと思います。

require 'rubygems'
gem "xcodeproj", "~> 0.9.0"
require 'xcodeproj'

xcodeprojがインストールされていない場合、エラーが出てしまいます。スタックトレースも出てしまうし、使い手はどう対処したら良いかよくわかりません。

/Users/katty/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find xcodeproj (~> 0.9.0) amongst [activesupport-4.0.0, ....] (Gem::LoadError)
	from /Users/katty/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
	from /Users/katty/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/rubygems.rb:1231:in `gem'
	from /Users/katty/sample.rb:3:in `
'

これでは困る。

例外をつかもうと試みる

ならば、例外をつかめば良い、ということで試してみました。Rubyでは、try~catchではなく、rescueという構文を使うそうです。

require 'rubygems'
begin
	gem "xcodeproj", "~> 0.9.0"
	require 'xcodeproj'
rescue
	puts "[ERROR] xcodeproj is required.\n"
	exit 1
end

しかし、同じように例外が飛んでしまいダメでした。
なぜ?つかめないような例外を投げているの?

LoadErrorを指定してrescue

Stack Overflowにありました。
スクリーンショット 2013-08-27 19.21.06
How to rescue from a require “gem_name” when the gem is not installed
rescueは例外クラスをひきつれて使うこともできるわけですが、無印の場合はStandardError以下のサブクラスが対象なのだそうです。LoadErrorはStandardErrorのサブクラスでないため、rescue節に入らないというわけなのだそう。
rescueにLoadErrorを指定してやります。

require 'rubygems'
begin
	gem "xcodeproj", "~> 0.9.0"
	require 'xcodeproj'
rescue LoadError
	puts "[ERROR] xcodeproj is required.\n"
	exit 1
end

するとちゃんと例外処理ができました。

[ERROR] xcodeproj is required.

終わりです。

タイトルとURLをコピーしました