Ruby 访问引发异常的接收对象

Ruby 访问引发异常的接收对象,ruby,exception,Ruby,Exception,在调试ActionMailer的一个非常奇怪的问题时,我意识到我不知道如何访问创建异常的对象。不是例外,而是对象本身 begin AppMailer.send_invoice(hostel_resident).deliver_later flash[:success] = "Your invoice was sent successfully!" rescue => msg # display the system generated error message fl

在调试ActionMailer的一个非常奇怪的问题时,我意识到我不知道如何访问创建异常的对象。不是例外,而是对象本身

begin
  AppMailer.send_invoice(hostel_resident).deliver_later
  flash[:success] = "Your invoice was sent successfully!"
rescue => msg 
  # display the system generated error message  
  flash[:error] = "#{msg}" 
end  

NoMethodError: undefined method `disposition_type' for #<Mail::UnstructuredField:0x009g71c2a68258>
开始
AppMailer.发送发票(旅舍居民)。稍后发送
flash[:success]=“您的发票已成功发送!”
rescue=>msg
#显示系统生成的错误消息
flash[:error]=“#{msg}”
结束
NoMethodError:未定义的方法“处置类型”#
这段代码非常适合捕获任何异常并打印消息

但是,如何获得
对象?我希望能够和这个家伙一起玩,阅读里面的信息,并且通常能够访问它

这必须是可能的,但是
inspect
没有帮助,
cause
没有用,
backtrace
只是告诉你发生的地方。我需要那个对象,那个不存在的方法的接收者

谢谢

actionmailer(4.2.4)
邮件(2.6.3)

这似乎是可行的,使用上的
接收器
(它是

obj=Object.new
将对象放入
开始
做点什么
救援命名错误=>e
放电子邮件
放e.接收器
结束
# #
#未定义的方法“do_something”#
# #
这似乎需要ruby>=2.3,要在<2.3时执行此操作,您必须执行类似的操作(未在较旧的ruby中测试,但应该可以):

class mynomethoderore
#拯救异常并将其包装到导致异常的方法中,使用'self'而不是'obj'`
错误=MyNoMethodError.new(e)
错误。我的接收器=obj
提出错误
结束
拯救MyNoMethodError=>c
放置c.inspect#自定义异常内容
放入c.cause.inspect#原始异常内容
把c.放在我的接收器上
结束
# #
# #
# #

使用上的
接收器(它是

obj=Object.new
将对象放入
开始
做点什么
救援命名错误=>e
放电子邮件
放e.接收器
结束
# #
#未定义的方法“do_something”#
# #
这似乎需要ruby>=2.3,要在<2.3时执行此操作,您必须执行类似的操作(未在较旧的ruby中测试,但应该可以):

class mynomethoderore
#拯救异常并将其包装到导致异常的方法中,使用'self'而不是'obj'`
错误=MyNoMethodError.new(e)
错误。我的接收器=obj
提出错误
结束
拯救MyNoMethodError=>c
放置c.inspect#自定义异常内容
放入c.cause.inspect#原始异常内容
把c.放在我的接收器上
结束
# #
# #
# #
似乎您正在使用。这是一个已知的问题,已经在GitHub中报告过。看

尝试使用不同版本的gem,2.6系列中的一些东西。

似乎您正在使用。这是一个已知的问题,已经在GitHub中报告过。看



尝试使用不同版本的gem,2.6系列中的一些东西。

小心引发异常。您几乎总是希望引发一个异常,该异常在其祖先链中具有
StandardError
。例如,请参阅。感谢您提供的伟大链接Cary。ThoughtBot总是一本很好的读物。永远不要在
rescue
中使用
Exception
类。勾选所有更改,以更好地反映您的评论。但是,有人知道如何获取接收对象吗?实际上,不需要编写
StandardError
,如果
rescue
:)中没有提供任何类,则这是一个默认类。)小心
引发异常
。您几乎总是希望引发一个异常,该异常在其祖先链中具有
StandardError
。例如,请参阅。感谢您提供的伟大链接Cary。ThoughtBot总是一本很好的读物。永远不要在
rescue
中使用
Exception
类。勾选所有更改,以更好地反映您的评论。但是,有人知道如何获取接收对象吗?实际上,不需要编写
StandardError
,如果
rescue
:)中没有提供任何类,则这是一个默认类。)我今天早些时候读了那篇文章。我不明白的是,MS Outlook如何可能影响我的服务器正在生成的附件?如果他在电脑上使用我的应用程序并通过我的应用程序发件人电子邮件地址向客户发送PDF发票,那么他使用MS Outlook对我的应用程序有何影响?一个使用MS Outlook的用户收到此错误。没有其他人是。我今天早些时候读过那篇文章。我不明白的是,MS Outlook如何可能影响我的服务器正在生成的附件?如果他在电脑上使用我的应用程序并通过我的应用程序发件人电子邮件地址向客户发送PDF发票,那么他使用MS Outlook对我的应用程序有何影响?一个使用MS Outlook的用户收到此错误。没有其他人是。奇怪,你用的是什么ruby?查看我链接的页面上以前的ruby版本,该方法在2.4、2.3而不是2.2中,因此它是在2.2之后添加的,在2.3之前(或期间)2.3不能为#`重新创建
NoMethodError:undefined method
receiver',我现在在2.2.3。有道理为什么它不起作用。@PatrickJones更新了我的答案,用一种方法使它起作用<2.3,尽管它没有那么漂亮,需要在抛出它的方法中捕获异常,包装它,然后抛出新的异常(我假设这种情况发生在
send_invoice
中的某个地方,这样你就可以在最后得到我的投票时
rescue
。你有没有可能回答上面关于MS Outlook如何影响客户的问题
obj = Object.new
puts obj.to_s

begin
  obj.do_something
rescue NoMethodError => e
  puts e.message
  puts e.receiver
end

# #<Object:0x007fa5ac84da88>
# undefined method `do_something' for #<Object:0x007fa5ac84da88>
# #<Object:0x007fa5ac84da88>
class MyNoMethodError < NoMethodError
  attr_accessor :my_receiver
end

obj = Object.new
puts obj.to_s

begin
  begin
    obj.do_something
  rescue NoMethodError => e
    # rescue the exception and wrap it in the method that caused it, using `self` instead of `obj`
    error = MyNoMethodError.new(e)
    error.my_receiver = obj
    raise error
  end
rescue MyNoMethodError => c
  puts c.inspect        # custom exception stuff
  puts c.cause.inspect  # original exception stuff
  puts c.my_receiver
end

# #<Object:0x007f884e846d58>
# #<MyNoMethodError: undefined method `do_something' for #<Object:0x007f884e846d58>>
# #<NoMethodError: undefined method `do_something' for #<Object:0x007f884e846d58>>
# #<Object:0x007f884e846d58>