Forum: Ruby Handling invalid options with OptionParser

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Da55cb4e9c39184563cd068113e3568f?d=identicon&s=25 Adam Penny (adampenny)
on 2008-10-18 20:22
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/optparse.rb:1443:in
`complete': invalid option: -x (OptionParser::InvalidOption)
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1441:in
`catch'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1441:in
`complete'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1280:in
`parse_in_order'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1247:in
`catch'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1247:in
`parse_in_order'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1241:in
`order!'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1332:in
`permute!'
  from
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.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.
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2008-10-18 20:36
(Received via mailing list)
Alle Saturday 18 October 2008, Adam Penny ha scritto:
>
>   from
>parse.rb:1241:in `order!'
> 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
Da55cb4e9c39184563cd068113e3568f?d=identicon&s=25 Adam Penny (adampenny)
on 2008-10-18 20:40
Stefano, that's a very big help, thank you very much!

Adam
Da55cb4e9c39184563cd068113e3568f?d=identicon&s=25 Adam Penny (adampenny)
on 2008-10-18 20:50
PennyMBP:~ adam$ wopol -l
invalid option: -l
Usage: wopol [options]
    -s, --server SERVERNAME
    -p, --printer PRINTERNAME
    -w, --wait SECONDS

Thought you might like to see the result after implementing your
suggestion. :-D Thanks again.
This topic is locked and can not be replied to.