def parse!(args)
      do_parse(args)
    rescue OptionParser::InvalidOption => ex
      @exception_handler.call("Unknown option #{ex.args.join(' ')}",@extra_error_context)
    rescue OptionParser::InvalidArgument => ex
      @exception_handler.call("#{ex.reason}: #{ex.args.join(' ')}",@extra_error_context)
    end
def parse!(args)
      do_parse(args)
    rescue OptionParser::InvalidOption => ex
      @exception_handler.call("Unknown option #{ex.args.join(' ')}",@extra_error_context)
    rescue OptionParser::InvalidArgument => ex
      @exception_handler.call("#{ex.reason}: #{ex.args.join(' ')}",@extra_error_context)
    end
Create the parser using the given +OptionParser+ instance and exception handling
 strategy.

 option_parser_factory:: An +OptionParserFactory+ instance, configured to parse wherever you are on the command line
 exception_klass_or_block:: means of handling exceptions from +OptionParser+.  One of:
                            an exception class:: will be raised on errors with a message
                            lambda/block:: will be called with a single argument - the error message.
 Parse the given argument list, returning the unparsed arguments and options hash of parsed arguments.
 Exceptions from +OptionParser+ are given to the handler configured in the constructor

 args:: argument list.  This will be mutated

 Returns unparsed args