Failed requires?

I'm running ruby 1.8.7. If I 'require' a file, and it fails, the program
just crashes with message like so:

no such file to load -- whatsit
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`gem_original_require'
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`require'
  from (irb):1

or (if if I turn auto_gem off):

./main.rb:3:in `require': no such file to load -- whatsit (LoadError)
  from ./main.rb:3

It seems like I should be given the chance to do something else if a
require fails, such as print an more understandable message to the
console or put something in a log. But it seems that ruby does not
return from the 'require' call, or allow catching an exception. Am I
right? And why is this?

···

--
Posted via http://www.ruby-forum.com/.

begin
  require "whatsit"
rescue LoadError => e
  puts "Failed to load whatsit:"
  puts e.message
  puts "Please install it."
  exit 1
end

···

Am 30.01.2011 07:07, schrieb Terry Michaels:

I'm running ruby 1.8.7. If I 'require' a file, and it fails, the program
just crashes with message like so:

no such file to load -- whatsit
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`gem_original_require'
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`require'
  from (irb):1

or (if if I turn auto_gem off):

./main.rb:3:in `require': no such file to load -- whatsit (LoadError)
  from ./main.rb:3

It seems like I should be given the chance to do something else if a
require fails, such as print an more understandable message to the
console or put something in a log. But it seems that ruby does not
return from the 'require' call, or allow catching an exception. Am I
right? And why is this?

Terry Michaels a écrit :

I'm running ruby 1.8.7. If I 'require' a file, and it fails, the program
just crashes with message like so:

no such file to load -- whatsit
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`gem_original_require'
  from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`require'
  from (irb):1

or (if if I turn auto_gem off):

/main.rb:3:in `require': no such file to load -- whatsit (LoadError)
  from ./main.rb:3

It seems like I should be given the chance to do something else if a
require fails, such as print an more understandable message to the
console or put something in a log. But it seems that ruby does not
return from the 'require' call, or allow catching an exception. Am I
right? And why is this?

Works for me :

$ irb
irb(main):001:0> require 'foo'
LoadError: no such file to load -- foo
  from (irb):1:in `require'
  from (irb):1
irb(main):002:0> begin
irb(main):003:1* require 'foo'
irb(main):004:1> rescue LoadError => e
irb(main):005:1> puts 'do something else'
irb(main):006:1> end
do something else
=> nil

···

--
Xavier Nayrac

Terry Michaels wrote in post #978462:

It seems like I should be given the chance to do something else if a
require fails, such as print an more understandable message to the
console or put something in a log. But it seems that ruby does not
return from the 'require' call, or allow catching an exception. Am I
right? And why is this?

A bare "rescue" without specifying a class will rescue StandardError
(and all its subclasses). But LoadError is not a subclass of
StandardError:

irb(main):001:0> LoadError.ancestors
=> [LoadError, ScriptError, Exception, Object, Kernel]

So you have to rescue it explicitly.

Google "ruby exception hierarchy" for more info.

···

--
Posted via http://www.ruby-forum.com/.