如何在Ruby optparse的异常中添加明确可提取的信息?
Ruby Optparse:自定义OptionParser::ParseError并提取错误信息
在Optparse中处理选项时,若要抛出带关键信息的OptionParser::ParseError并精准捕获提取参数,有两种实用方案:
方案一:给原生异常附加自定义属性
直接给OptionParser::ParseError实例动态添加实例变量,存入选项名、输入值等关键信息,捕获时直接读取:
require 'optparse' options = {} parser = OptionParser.new do |opts| opts.on('-n', '--number NUM', Integer, '输入一个偶数') do |num| if num.odd? # 创建异常并附加自定义属性 error = OptionParser::ParseError.new("数字必须是偶数") error.instance_variable_set(:@option_name, '-n/--number') error.instance_variable_set(:@input_value, num) raise error end options[:number] = num end end begin parser.parse! puts "输入的偶数是: #{options[:number]}" rescue OptionParser::ParseError => e # 提取自定义属性并输出友好提示 option_name = e.instance_variable_get(:@option_name) input_value = e.instance_variable_get(:@input_value) puts "错误: 选项 #{option_name} 输入的值 #{input_value} 不是偶数,请输入一个偶数。" exit(1) end
运行my_prog.rb -n 5时,会输出:错误: 选项 -n/--number 输入的值 5 不是偶数,请输入一个偶数。,完美获取用户输入的参数值。
方案二:自定义异常子类(更严谨)
继承OptionParser::ParseError创建自定义异常类,通过属性暴露关键信息,可精准区分自定义错误与Optparse原生错误:
require 'optparse' # 自定义异常类,继承自OptionParser::ParseError class InvalidNumberError < OptionParser::ParseError attr_reader :option_name, :input_value def initialize(option_name, input_value) @option_name = option_name @input_value = input_value super("选项 #{option_name} 的值 #{input_value} 无效,必须是偶数") end end options = {} parser = OptionParser.new do |opts| opts.on('-n', '--number NUM', Integer, '输入一个偶数') do |num| raise InvalidNumberError.new('-n/--number', num) if num.odd? options[:number] = num end end begin parser.parse! puts "输入的偶数是: #{options[:number]}" rescue InvalidNumberError => e # 精准捕获自定义错误,提取属性 puts "错误: 选项 #{e.option_name} 输入的值 #{e.input_value} 不是偶数,请输入一个偶数。" exit(1) rescue OptionParser::ParseError => e # 处理其他Optparse原生错误(如参数类型错误) puts "参数错误: #{e.message}" exit(1) end
这种方式避免了依赖异常消息字符串判断错误类型,代码可读性和维护性更强,适合复杂的参数校验场景。
内容的提问来源于stack exchange,提问作者Masa Sakano
相关产品推荐
相关产品推荐

