You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:48:16