Stefano Crocco
10/18/2008 6:33:00 PM
Alle Saturday 18 October 2008, Adam Penny ha scritto:
> Hi there,
>
> I wrote my own Wake on Lan Script in ruby that uses a Plist to look up
> either target Mac address by selected printer or target MAC address by
> server and I use option parser for this.
>
> It all works fine if the arguments are input correctly, but if the
> arguments are off you get something like this. -x is not declared in my
> options and was a test to see how it did when it got something that it
> didn't recognize.
>
> ruby test.rb -x
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1443:in `complete': invalid option: -x
> (OptionParser::InvalidOption)
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1441:in `catch'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1441:in `complete'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1280:in `parse_in_order'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1247:in `catch'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1247:in `parse_in_order'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1241:in `order!'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1332:in `permute!'
> from
> /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/opt
>parse.rb:1353:in `parse!'
> from test.rb:4
>
> It's not the end of the world as if the options are wrong then it won't
> do anything anyway, but I was wondering if anyone could tell me if
> there's any method in the class or extra thing I could do to catch dodgy
> arguments and output the help file or the banner rather than this
> inelegant list of errors?
>
> Thanks in advance.
I guess you can enclose the call to OptionParser#parse! in a begin/rescue
expression, rescuing OptionParser::InvalidOption or OptionParser::ParseError
(which is the parent of InvalidOption) and display an error message. Here's a
simple example of how you can do it:
require 'optparse'
o = OptionParser.new do |o|
o.banner = "test usage: test [OPTIONS]"
o.on('-o', '--option', 'this option does nothing '){}
end
begin o.parse! ARGV
rescue OptionParser::InvalidOption => e
puts e
puts o
exit 1
end
the line
puts e
will display a message like
invalid option -a
(where -a is the invalid option passed to the script). The line
puts o
will display the usage message.
exit 1
will make the script exit with the error code 1.
I hope this helps
Stefano