代码之家  ›  专栏  ›  技术社区  ›  Mark Szymanski

NET::http.get出现奇怪的Ruby错误

  •  2
  • Mark Szymanski  · 技术社区  · 15 年前

    我有以下Ruby代码:

    require 'net/http'
    require 'uri'
    
    include Net
    
    $DEBUG = 1
    
    print "Enter a GitHub username: "
    username = gets
    
    puts "Username = #{username}" if $DEBUG == 1
    
    source = HTTP.get(URI.parse("http://github.com/api/v2/xml/user/show/#{username}"))
    
    puts source if $DEBUG == 1
    

    每当我运行它时,都会得到以下错误:

    Exception `Errno::EAGAIN' at /usr/local/lib/ruby/1.9.1/net/protocol.rb:135 - Resource temporarily unavailable - read would block
    

    即使它工作得很好。有什么关于为什么会发生这种情况以及如何阻止这种情况发生的想法吗?

    事先谢谢!

    编辑 使用 htty ,我能够连接到所需的服务器,并获得没有任何错误的资源。

    2 回复  |  直到 15 年前
        1
  •  6
  •   the Tin Man    15 年前

    我的猜测是你对全球 $DEBUG 变量在net::protocol中显示错误或不需要的状态。如果你设置 $DEBUG = false 它消失了。

    在NET::Protocol代码中,此时它正在尝试进行非阻塞读取,似乎正超时。

    Ruby使用$debug标志作为 -d 机制。如果你放 puts $DEBUG 在脚本中运行它,您将看到变量切换。因为它是全局的,所以在任何需要调试的代码中都可以看到它,所以您或代码的作者可以触发额外的特殊语言来帮助调试:

    greg-mbp-wireless:Desktop greg$ ruby untitled.rb 
    false
    greg-mbp-wireless:Desktop greg$ ruby -d untitled.rb 
    true
    
        2
  •  1
  •   Marek Sapota    15 年前

    这就是$debug=1,如果没有定义$debug(或设置为false),就没有错误。可能Ruby解释器在内部使用它,如果设置了它,它就会打印出调试信息。

    推荐文章