ruby中的block_singleton_method是什么?为什么我退出时会收到此错误

时间:2017-09-02 17:54:47

标签: ruby

下面是gtk结束操作调用的代码 - >

def on_main_window_destroy(object)
  begin
  $client.send(':exit')
  Thread.kill $client.response
  rescue
    puts 'exiting'
  end
  Thread.kill $receiving_message
  Gtk.main_quit()
  exit
end

导致此输出。

app.rb:81:in `exit': exit
 from app.rb:81:in `on_main_window_destroy'
 from /home/user/.gem/ruby/2.4.0/gems/gobject-introspection-3.1.8/lib/gobject-introspection/loader.rb:110:in `invoke'
 from /home/user/.gem/ruby/2.4.0/gems/gobject-introspection-3.1.8/lib/gobject-introspection/loader.rb:110:in `block in define_singleton_method'
 from app.rb:97:in `<main>'

该程序工作正常..它并没有给我造成混乱..但我想知道这些错误的原因,以便我可以处理它。

1 个答案:

答案 0 :(得分:1)

Kernel#exit引发了终止程序的异常,看起来像是你要问的异常消息:

  

通过引发SystemExit异常来启动Ruby脚本的终止。可能会发现此异常。

对于堆栈跟踪的"block in define_singleton_method"部分,虽然ruby有define_singleton_method,但如果查看指定文件的第110行,您将看到您所在的方法也称为define_singleton_method,您在该方法的块内:

def define_singleton_method(klass, name, info)
  # ... 
  singleton_class.__send__(:define_method, name) do |*arguments, &block|
    arguments, block = prepare.call(arguments, &block) # <<< Line 110
    # ...
  end
end

我不确定为什么你实际上看到的输出而不是像往常那样只是默默地退出,有可能是代码中的某个地方,有些东西正在拯救基地Exception ,而不是StandardError,这是generally a bad idea,虽然它们可能只是记录/输出并重新提升它(正如其中一些答案中所见,可以),它全部都是只是猜测没有深入挖掘代码(它甚至可能不在这个宝石中)