如何在不更改ruby中的类的情况下向异常消息添加信息?

我目前使用的方法是

strings.each_with_index do |string, i|
  begin
    do_risky_operation(string)
  rescue
    raise $!.class, "Problem with string number #{i}: #{$!}"
  end
end

理想情况下,我还希望保留回溯.

有更好的办法吗?

推荐答案

要重新引发异常并修改消息,同时保留异常类及其回溯,只需执行以下操作:

strings.each_with_index do |string, i|
  begin
    do_risky_operation(string)
  rescue Exception => e
    raise $!, "Problem with string number #{i}: #{$!}", $!.backtrace
  end
end

这将产生:

# RuntimeError: Problem with string number 0: Original error message here
#     backtrace...

Ruby相关问答推荐

如何使用Ruby中的时区函数S标准库?

CarrierWave Multi-uploader重命名现有文件

Ruby 中的 Float#floor 和 Float#to_i 有什么区别?

当一个方法在没有参数的 return 关键字上提前退出时,返回什么值?

Windows powershell文件类型编码中Ruby IO流的原因是什么

有人可以解释 Ruby 在块中使用管道字符吗?

Rspec: expectvsexpect什么区别?

需要Ruby

Ruby 中是否有像 C 中一样的主要方法?

如何在没有继承方法的情况下获取类的公共方法?

我可以在 Ruby 2.x 中要求命名参数吗?

object_id 分配如何工作?

在本地文件夹中安装 gem

array.include?多个值

如何在 Ruby 符号中转义破折号-?

相当于 Ruby 中的通过

在 Ruby 中按名称获取一个类?

如何在没有警告的情况下重新定义 Ruby 常量?

如何理解 class_eval() 和 instance_eval() 的区别?

安装 Jekyll 时出错 - 本机扩展构建