たぶん基本的なことですが、恥ずかしながら少しずつ勉強しております。
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にありました。
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.
終わりです。