optparser = OptionParser.new do |args|
list=[:foo,:bar,:baz]
begin
args.on("--l [OPTION]",list,"Blah") { |o| }
rescue
puts "Rescuing in the block"
end
end
begin
optparser.parse!(ARGV)
rescue
puts "Rescuing in main"
end
./foo.rb -l FOO ends up being rescued in main.
Why is this? the parse! method just calls the block defined in new doesn't
it? In which case, a begin and rescue block should work there right? Even if
I remove the begin and rescue block in main, it doesn't get rescued at all,
it just ends up spitting the usual ugly error etc.
optparser = OptionParser.new do |args|
list=[:foo,:bar,:baz]
begin
args.on("--l [OPTION]",list,"Blah") { |o| }
rescue
puts "Rescuing in the block"
end
This rescue does not make sense. Because the code is invoked once
upon OptionParser.new. Parsing errors are thrown from parse and
parse!.
end
begin
optparser.parse!(ARGV)
rescue
puts "Rescuing in main"
end
./foo.rb -l FOO ends up being rescued in main.
Why is this? the parse! method just calls the block defined in new doesn't
it? In which case, a begin and rescue block should work there right? Even if
I remove the begin and rescue block in main, it doesn't get rescued at all,
it just ends up spitting the usual ugly error etc.
You need to rescue Exception because rescue without any arguments only
rescues RuntimeErrors IIRC, it definitively does not catch every sub
class of Exception.
On Wed, Apr 15, 2009 at 5:35 PM, Robert Klemme <shortcutter@googlemail.com>wrote:
2009/4/15 Srijayanth Sridhar <srijayanth@gmail.com>:
> Hello,
>
> The following code:
>
> require 'optparse'
>
> optparser = OptionParser.new do |args|
> list=[:foo,:bar,:baz]
> begin
> args.on("--l [OPTION]",list,"Blah") { |o| }
> rescue
> puts "Rescuing in the block"
> end
This rescue does not make sense. Because the code is invoked once
upon OptionParser.new. Parsing errors are thrown from parse and
parse!.
> end
>
> begin
> optparser.parse!(ARGV)
> rescue
> puts "Rescuing in main"
> end
>
> ./foo.rb -l FOO ends up being rescued in main.
>
> Why is this? the parse! method just calls the block defined in new
doesn't
> it? In which case, a begin and rescue block should work there right? Even
if
> I remove the begin and rescue block in main, it doesn't get rescued at
all,
> it just ends up spitting the usual ugly error etc.
You need to rescue Exception because rescue without any arguments only
rescues RuntimeErrors IIRC, it definitively does not catch every sub
class of Exception.
You need to rescue Exception because rescue without any arguments only
rescues RuntimeErrors IIRC
rescue without any arguments rescues StandardError. (StandardError is an
ancestor of RuntimeError, and Exception is an ancestor of StandardError)
See:
You should normally be a bit wary of 'rescue Exception'. This will
rescue all sorts of internal failures like NoMemoryError or SyntaxError
which you may not want to hide.