From: "Kabu and Ruby管理人" Date: 2008-02-22T14:02:31+09:00 Subject: [ruby-list:44674] beginで捉えられないエラー?? いろいろやってみたのですが、うまく行かないので質問させてください。 KirbyBaseというデータベースに株価データを取り込むようにしたのですが、最初のうちは順調に取り込んでいますが、以下のようなエラーが出てしまいます。 全体をbegin ... rescue ... endで括ったりしたのですが、やはりエラーが出てしまいます。 ライブラリからのエラーのようですが、どういう意味でしょうか? とほほ、、。 c:/ruby/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired (Timeout::E rror) from c:/ruby/lib/ruby/1.8/timeout.rb:56:in `timeout' from c:/ruby/lib/ruby/1.8/timeout.rb:76:in `timeout' from c:/ruby/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill' from c:/ruby/lib/ruby/1.8/net/protocol.rb:86:in `read' from c:/ruby/lib/ruby/1.8/net/http.rb:2241:in `read_chunked' from c:/ruby/lib/ruby/1.8/net/http.rb:2216:in `read_body_0' from c:/ruby/lib/ruby/1.8/net/http.rb:2182:in `read_body' from c:/ruby/lib/ruby/1.8/open-uri.rb:258:in `open_http' ... 14 levels... from GetAllDataKB_ver0.01.rb:59:in `step' from GetAllDataKB_ver0.01.rb:59 from GetAllDataKB_ver0.01.rb:17:in `downto' from GetAllDataKB_ver0.01.rb:17 コードはこんな感じです。 #! ruby -Ks require 'open-uri' require 'nkf' require 'jcode' require 'date' require 'kirbybase' require 'kconv' $KCODE='s' # 漢字コードをEUCに。Windowsでは 's' today = Date::today yahooformat = Regexp.new( '(\d+)年(\d+)月(\d+)日([\d,]+)([\d,]+)([\d,]+)([\d,]+)([\d,]+)([\d,]+)' ) storedir = 'c:\ruby\kabu\tbl' 9350.downto(5000) do |meigara| begin db = KirbyBase.new puts "#{meigara}のデータ取得を開始します。" begin Dir::chdir( storedir ) rescue puts "#{storedir}は存在しません。作成します。" Dir::mkdir( storedir ) Dir::chdir( storedir ) end begin Dir::chdir( "#{meigara}" ) rescue puts "#{meigara}フォルダは存在しません。作成します。" Dir::mkdir( "#{meigara}" ) Dir::chdir( "#{meigara}" ) end begin stock_tbl = db.get_table( meigara.to_s.intern ) rescue puts "#{meigara}のテーブルは存在しません。作成します。" stock_tbl = db.create_table( meigara.to_s.intern , :銘柄番号 , {:DataType=>:String, :Index=>1} , :年月日 , {:DataType=>:String, :Index=>2} , :始値 , :Integer , :高値 , :Integer , :安値 , :Integer , :終値, :Integer , :出来高 , :Integer , :調整後終値 , :Integer) end if stock_tbl.total_recs == 0 lastdate = Date::new(1983 , 1 , 4) puts "#{meigara}はデータが保存されていません。取得を試みます。" else lastdatestr = (stock_tbl[stock_tbl.total_recs].年月日).split(/\s*-\s*/) lastdate = Date::new(lastdatestr[0].to_i , lastdatestr[1].to_i , lastdatestr[2].to_i) if lastdate >= today next end lastdate = lastdate + 1 end max = today - lastdate strall = Array.new 0.step(max , 50) do |i| yahoourl = "http://table.yahoo.co.jp/t?s=#{meigara}.t&a=#{lastdate.month}&b=#{lastdate.day}&c=#{lastdate.year}&d=#{today.month}&e=#{today.day}&f=#{today.year}&g=d&q=t&y=#{i}&z=#{meigara}.t&x=.csv" begin f = open( yahoourl ) rescue puts 'タイムアウトです。再試行します。' retry end str = Array.new temp = String.new temp = f.read.tosjis temp.each_line do |line| line = line.gsub("," , "") if line.scan(/#{yahooformat}/) != [] str.push line.scan(/#{yahooformat}/) end end if str == [] break end strall.push str end str2 = Array.new strall.each do |s| s.each do |t| t.each do |u| str2.push u end end end if str2 == [] next end puts "#{meigara}のデータをテーブルに出力します。" str2.reverse_each do |u| stock_tbl.insert( "#{meigara}" , Date::new( u[0].to_i , u[1].to_i , u[2].to_i ).to_s , u[3].to_i , u[4].to_i , u[5].to_i , u[6].to_i , u[7].to_i , u[8].to_i ) end rescue puts 'エラーです。リトライします。' retry end end Kabu and Ruby管理人 Web site: 『Rubyを使ってみよう!!』 http://www.geocities.jp/kabuandruby/ e-mail: kabu_and_ruby@ybb.ne.jp