如何在EventMachine实现中捕获异常?

Ric*_*urt 6 ruby xmpp eventmachine

我对这个帖子有类似的问题,我尝试了给定的解决方案,但无济于事.

我的项目是一个Ruby bot,它使用Blather库连接到Jabber服务器.问题是,当服务器出现问题并且Blather生成异常时,整个程序退出,我没有机会捕获异常.

这是一些显示问题的简单代码.在localhost上没有运行Jabber服务器,因此Blather客户端会抛出异常.我的印象是EM.error_handler {}能够拦截它,但我从未看到**** ERROR消息,程序就停止了.:(

#!/usr/bin/env ruby
require 'rubygems'
require 'blather/client/client'

EM.run do
  EM.error_handler { puts " **** ERROR " }

  Blather::Stream::Client.start(
    Class.new {
    }.new, 'echo@127.0.0.1', 'echo')
end
Run Code Online (Sandbox Code Playgroud)

我认为问题是Blather也使用EventMachine并且可能正在调用EM.stop,这会导致外部EM实例停止.

tad*_*man 5

异常和异步编程不是朋友,因此正确处理它们可能很棘手.在同步模型中,可以通过使用rescue可能产生异常的代码块来捕获异常,但是一旦创建了回调方法,该块就需要自己的异常处理,因为它将在该上下文之外运行.

希望error_handler将捕获您的异常,但如果您涉及其他线程可能无法捕获它们.

你可以随时monkeypatch EventMachine.stop_event_loopEventMachine.stop_server查看是否这是被调用的方法.