Ruby运行函数时出现Time.parse参数越界错误的解决方案咨询
Ruby代码执行时输出内容但抛出ArgumentError错误
运行以下Ruby代码时,程序能输出部分内容,但同时抛出ArgumentError错误(提示argument out of range),错误触发在day = Time.parse(get_date(row))这一行。
原代码
time = Time.parse(@year) puts "#{time.strftime("%B_%Y")}" file_path = file_access CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row| day = Time.parse(get_date(row)) #Error line max = row[:max_temperaturec].to_i min = row[:min_temperaturec].to_i unless(min.zero? || max.zero?) print "#{day.strftime("%d")} " unless min.zero? min.times{ print '+'.blue } end unless max.zero? min.times{ print '+'.red } end puts "#{min}C.-.#{max}C" end end
错误回溯信息
Traceback (most recent call last): 17: from WeatherMan_CompleteProject.rb:20:in `' 16: from /home/dev/rubyprograms/WeatherMan_Main_CLASS_Complate.rb:155:in `task4' 15: from /usr/lib/ruby/2.7.0/csv.rb:510:in `foreach' 14: from /usr/lib/ruby/2.7.0/csv.rb:658:in `open' 13: from /usr/lib/ruby/2.7.0/csv.rb:511:in `block in foreach' 12: from /usr/lib/ruby/2.7.0/csv.rb:1280:in `each' 11: from /usr/lib/ruby/2.7.0/csv.rb:1280:in `each' 10: from /usr/lib/ruby/2.7.0/csv/parser.rb:336:in `parse' 9: from /usr/lib/ruby/2.7.0/csv/parser.rb:823:in `parse_quotable_loose' 8: from /usr/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line' 7: from /usr/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line' 6: from /usr/lib/ruby/2.7.0/csv/parser.rb:52:in `block in each_line' 5: from /usr/lib/ruby/2.7.0/csv/parser.rb:871:in `block in parse_quotable_loose' 4: from /usr/lib/ruby/2.7.0/csv/parser.rb:1122:in `emit_row' 3: from /home/dev/rubyprograms/WeatherMan_Main_CLASS_Complate.rb:156:in `block in task4' 2: from /usr/lib/ruby/2.7.0/time.rb:375:in `parse' 1: from /usr/lib/ruby/2.7.0/time.rb:266:in `make_time' /usr/lib/ruby/2.7.0/time.rb:266:in `local': argument out of range (ArgumentError)
原因分析
错误根源是Time.parse接收到了无法解析为有效日期的字符串,导致Ruby构造时间对象时传入的参数超出合法范围(比如日期为32号、月份为13、格式混乱等)。
解决步骤
1. 定位无效日期字符串
在报错行前添加打印语句,输出get_date(row)的返回值,找到具体的非法日期:
CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row| date_str = get_date(row) puts "当前行日期:#{date_str}" # 打印日期字符串 day = Time.parse(date_str) # 后续代码... end
2. 使用明确的日期格式解析
不要依赖Time.parse的自动推断,改用Time.strptime指定CSV中日期的具体格式(比如日期格式是YYYY-MM-DD),避免自动解析出错:
# 假设日期格式为年-月-日 day = Time.strptime(get_date(row), "%Y-%m-%d")
如果格式不匹配,会直接抛出明确错误,便于排查。
3. 捕获异常跳过无效行
添加异常捕获逻辑,遇到无效日期时跳过该行,避免程序崩溃:
CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row| begin day = Time.parse(get_date(row)) rescue ArgumentError => e puts "跳过无效行:#{row},错误信息:#{e.message}" next end # 后续代码... end
内容的提问来源于stack exchange,提问作者Rabab Zahra
相关产品推荐
相关产品推荐

