- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们似乎遇到了 rescue Exception
没有捕捉到特定异常的情况。
我正在尝试发送有关发生的任何异常的电子邮件警报,然后继续处理。我们已经对有意退出进行了必要的处理。我们希望循环在提醒我们之后继续进行其他任何事情。
根据堆栈跟踪,未被捕获的异常表面上是 Timeout::Error
。
这是堆栈跟踪,删除了对我的中间代码的引用(我的代码的最后一行是 request.rb:93):
/opt/ruby-enterprise/lib/ruby/1.8/timeout.rb:64:in `rbuf_fill': execution expired (Timeout::Error)
from /opt/ruby-enterprise/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
from /opt/ruby-enterprise/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
from /opt/ruby-enterprise/lib/ruby/1.8/net/protocol.rb:126:in `readline'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:2017:in `read_new'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:1051:in `__request__'
from /mnt/data/blueleaf/releases/20150211222522/vendor/bundle/ruby/1.8/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:1037:in `__request__'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:543:in `start'
from /opt/ruby-enterprise/lib/ruby/1.8/net/http.rb:1035:in `__request__'
from /mnt/data/blueleaf/releases/20150211222522/vendor/bundle/ruby/1.8/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request'
from /mnt/data/blueleaf/releases/20150211222522/app/models/dst/request.rb:93:in `send'
[intermediate code removed]
from script/dst_daemon.rb:49
from script/dst_daemon.rb:46:in `each'
from script/dst_daemon.rb:46
from /opt/ruby-enterprise/lib/ruby/1.8/benchmark.rb:293:in `measure'
from script/dst_daemon.rb:45
from script/dst_daemon.rb:24:in `loop'
from script/dst_daemon.rb:24
from script/runner:3:in `eval'
from /mnt/data/blueleaf/releases/20150211222522/vendor/bundle/ruby/1.8/gems/rails-2.3.14/lib/commands/runner.rb:46
from script/runner:3:in `require'
这是 request.rb#send,第 93 行带有注释:
def send
build
uri = URI.parse([DST::Request.configuration[:prefix], @path].join('/'))
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
https_request = Net::HTTP::Post.new(uri.request_uri.tap{|e| debug_puts "\nURL: #{e}, host:#{uri.host}"})
# line 93:
https_request.body = request
response = https.request(https_request)
# the rest should be irrelevant
这是dst_daemon.rb;第 49 行用注释表示,应该捕获除故意中断之外的任何内容的 rescue Exception
接近尾声:
DST::Request.environment = :production
class DST::Request::RequestFailed < Exception; end
Thread.abort_on_exception = true
SEMAPHORE = 'import/dst/start.txt' unless defined?(SEMAPHORE)
DEBUG_DST = 'import/dst/debug.txt' unless defined?(DEBUG_DST)
DEBUG_LOG = 'import/dst/debug.log' unless defined?(DEBUG_LOG)
def debug_dst(*args)
File.open(DEBUG_LOG, 'a') do |f|
f.print "#{Time.now.localtime}: "
f.puts(*args)
end if debug_dst?
end
def debug_dst?
File.exist?(DEBUG_DST)
end
dst_ids = [Institution::BAA_DST_WS_CLIENT_ID, Institution::BAA_DST_WS_DEALER_ID]
institutions = Institution.find_all_by_baa_api_financial_institution_id(dst_ids)
DST::Collector.prime_key!
loop do
begin
if File.exist?(SEMAPHORE)
debug_dst 'waking up...'
custodians = InstitutionAccount.acts_as_baa_custodian.
find_all_by_institution_id(institutions).select(&:direct?)
good,bad = custodians.partition do |c|
c.custodian_users.map{|e2|e2.custodian_passwords.count(:conditions => ['expired is not true']) == 1}.all?
end
if bad.present?
msg = " skipping: \n"
bad.each do |c|
msg += " #{c.user.full_name_or_email}, custodian id #{c.id}: "
c.custodian_users.each{|cu| msg += "#{cu.username}:#{cu.custodian_passwords.count(:conditions => ['expired is not true'])}; "}
msg += "\n"
end
AdminSimpleMailer.deliver_generic_mail("DST Daemon skipping #{bad.size} connections", msg)
debug_dst msg
end
Benchmark.measure do
good.each do |custodian|
begin
debug_dst " collecting for: #{custodian.name}, #{custodian.subtitle}, (#{custodian.id.inspect})"
# line 49:
DST::Collector.new(custodian, 0).collect!
rescue DST::Request::PasswordFailed, DST::Request::RequestFailed => e
message = e.message + "\n\n" + e.backtrace.join("\n")
AdminSimpleMailer.deliver_generic_mail("DST Daemon Connection Failed #{e.class.name}", message)
debug_dst " skipping, #{e.class}"
end
end
end.tap{|duration| debug_dst "collection done, duration #{duration.real.to_f/60} minutes. importing" }
DST::Strategy.new(Date.yesterday, :recompute => true).import!
debug_dst 'import done.'
rm SEMAPHORE, :verbose => debug_dst?
else
debug_dst 'sleeping.' if Time.now.strftime("%M").to_i % 5 == 0
end
rescue SystemExit, Interrupt
raise
rescue Exception => e
message = e.message + "\n\n" + e.backtrace.join("\n")
AdminSimpleMailer.deliver_generic_mail("DST Daemon Exception #{e.class.name}", message)
ensure
sleep 60
end
end
除了从 SystemExit 或 Interrupt 之外,这个循环不应该以堆栈跟踪退出吗?
最佳答案
您可能已经知道,在救援 block 内调用 raise
会向调用者抛出异常。由于 Timeout::Error
是 ruby 1.8* 中的一个 Interrupt
,net_http 引发的超时异常在 rescue SystemExit, Interrupt
block 中得到处理,而不是比下面的 rescue Exception => e
更重要。
要验证 Timeout::Error
是一个中断,只需评估 Timeout::Error.ancestors
。您从中得到的是类 Timeout::Error 继承自的层次结构。
*在 ruby1.9 中不再是这种情况。
关于ruby - "rescue Exception"不拯救超时::net_http 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699593/
我无法确定以下 ruby 内联救援代码有什么问题 def test_check() p "first st" t = 5 * lsdj rescue return false p "second
我知道全局变量 $! 包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法? rescue $! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这
class A def a_method #.. end end class B e p e.message end # ... end 我想在 B 类中的每个方法(
我会定义值(value)。但是这个值可能在散列的键值中。如果此键不存在,我将使用 rescue 定义值为 nil。例如 foo = bar[:a][:b][:c] 救援 nil 但在实践中告诉我糟糕的
这是一个简单的例子: puts File.join(nil, "hello") 会输出 test.rb:4:in 'join': can't convert nil into String (Type
一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据. ruby>file=open("some_file"
我正在使用经常超时的 API 运行脚本。当发生这种情况时,我正在使用 begin/rescue block 让它进入 redo,但我想在运行 redo 之前记录命令行发生的事情 命令。 begin #
我有时会遇到一些意外错误,例如超时错误、503 错误等。有些错误我什至不知道我可能会收到。我无法通过执行以下操作来解释所有这些问题: rescue Timeout::Error => e 拯救Exce
在 Ruby 中,您可以使用 rescue => e 捕获异常,而无需显式传递任何类型的异常,例如 rescue CustomException => e。 我可以看出它并没有捕获所有异常,因为: d
我想将以下 erb 代码转换成 slim。 我的做法是: - begin = some_function - rescue Exception = some_other_fu
我理解救援的概念——我的问题是: 当我实际创建一个对象时,我应该在我的类中编写我的begin rescue end 代码还是应该在类之外编写它?如果我有两个文件 - 一个是我的类(class),一个是
局部变量 begin transaction #Code inside transaction object = Class.new attributes raise unles
在 ruby 中,要捕获错误,可以使用 rescue 语句。通常,此语句发生在 begin 和 end 之间。还可以将 rescue 语句用作 block (do ... end) 或方法 (de
我正在努力将以下代码作为后台作业发送,同时不时遇到一个或另一个错误, 我的应用程序/ worker /brassring.rb 是 require File.dirname(__FILE__)+"/b
我已将 Resque 添加到我的 Rails 3 项目中。我创建了一个从/向数据库读取/写入一些东西的作业。 问题是我在终端中看不到 SQL 查询日志,例如 "Post Load (0.5ms) SE
我正在尝试通过 Resque 发送 Devise 电子邮件。 定期电子邮件通过 Resque 发送就好了。并且设计电子邮件发送得很好,但不是通过 Resque 发送设计电子邮件。我得到“找不到有效的映
我有一组连接到各种 API 的 Adapter 类,等等。以下是每个适配器如何设置的简单通用示例: class AmazonAdapter include Sidekiq::Worker
This question already has answers here: How does one use rescue in Ruby without the begin and end bl
在 Ruby koans 的第 6 个练习中,有: def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil #
我的 Grape 应用程序有几个错误处理程序,最后包括: rescue_from :all, backtrace: true do |e| message = { errors: { all: e
我是一名优秀的程序员,十分优秀!