gpt4 book ai didi

ruby-on-rails - 救援 block 未捕获引发的错误

转载 作者:行者123 更新时间:2023-12-03 08:44:23 27 4
gpt4 key购买 nike

使用 Action 邮件发送电子邮件时,我们遇到了生产问题。

NameError
undefined local variable or method `to_ary' for #<Mail::Part:0x0000000008e0c998>
Did you mean? to_addrs

错误看起来完全是随机的,并且行为方式与 https://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/完全相同

我想做的是猴子修补 missing_method使其起作用。
所以我创建了一些测试,包括

let(:part) { Mail::Part.new }

it 'returns self' do
allow_any_instance_of(Mail::Message).to receive(:method_missing).and_raise(NameError, 'error part')
expect([part].flatten).to eq [part]
end

并创造了猴子补丁

require 'mail'

module Mail
class Part < Message
# monkey patched due to same behaviour like
# https://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/v
def method_missing(name, *args, &block)
begin
super
pp :hello
rescue NameError => e
return [self] if name.try(:to_sym) == :to_ary
raise e
end
end
end
end

此测试的目的是 Array#flatten在其内容上调用 to_ary。通常未定义 Mail::Part#method_missing,但我创建了一个以处理 NameError中可能的 Mail::Message#method_missing并返回正确的值。

问题是,调用了 Mail::Part#method_missing,调用了 super并引发了 NameError,但是抢救没有处理任何事情。由于引发错误,跳过 pp :hello

所以测试最终以
NameError: error part

0) Mail::Part call flatten with NameError returns self
Failure/Error: expect([part].flatten).to eq [part]

NameError:
error part
# ./spec/lib/core_ext/mail/part_spec.rb:13:in `flatten'
# ./spec/lib/core_ext/mail/part_spec.rb:13:in `block (4 levels) in <top (required)>'
# ./spec/active_record_spec_helper.rb:19:in `block (2 levels) in <top (required)>'

另一个问题是,当我尝试时,测试最终以无限递归结束
def method_missing(name, *args, &block)
return [self]
end

与相同
def method_missing(name, *args, &block)
begin
raises_name_error
rescue NameError => e
return [self] if name.try(:to_sym) == :to_ary
raise e
end
end

def raises_name_error
raise NameError, 'error part'
end

但是在这种情况下,急救块会处理 NameError

有解决方案的主意吗?

最佳答案

解决者

module Mail
class Part < Message
def to_ary
[]
end
end
end

我最初的解决方案尝试不过分。

关于ruby-on-rails - 救援 block 未捕获引发的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com