In the rescue block, can I access the String “something”?
There is no way I am aware of which allows for fetching the instance
from the NoMethodError if this is what you want. If you display the
exception you will see a textual description probably derived from #inspect:
irb(main):001:0> begin
irb(main):002:1* “”.foo
irb(main):003:1> rescue Exception => e
irb(main):004:1> puts e.display
irb(main):005:1> end
undefined method `foo’ for “”:String
=> nil
irb(main):006:0>
If that is not sufficient for you, you can reference a variable defined
after “begin”:
irb(main):006:0> begin
irb(main):007:1* x = “”
irb(main):008:1> x.foo
irb(main):009:1> rescue Exception => e
irb(main):010:1> p x
irb(main):011:1> end
“”
=> “”
irb(main):012:0>
In the rescue block, can I access the String “something”?
Best,
Florian
Posted viahttp://www.ruby-forum.com/.
Not by default. According to http://www.ruby-doc.org/ruby-1.9/classes/Exception.html
an exception provides “…information about the exception—its type
(the exception’s class name), an optional descriptive string, and
optional traceback information…”
However the same page also says “…Programs may subclass Exception to
add additional information.”
So, if your roll your own exceptions it’s possible to add this
functionality.
class MyException < Exception
attr_accessor :source
def initialize(msg = nil, source = nil)
super(msg) @source = source
end
end
class Test
def enclose(obj)
if obj.kind_of?(String)
“(#{obj})”
else
raise MyException.new(‘Enclose needs a string!’, obj)
end
end
end
begin
t = Test.new
puts t.enclose(‘foo’)
puts t.enclose(5)
rescue MyException => err
puts “Error: #{err.message}”
puts “Source: #{err.source}”
end
Overriding the default Exception class might also be possible (after
all, it’s ruby) but changing “default” behavior can be pretty risky as
well.
The author suggests to let the method_missing of Nil always return nil
so you could do things like:
some_object.this_is_null.do_something_more
would return nil and not raise on the undefined method
‘do_something_more’ on nil.
I thought such an approach was to intrusive and it would be better to do
something like: