【问题标题】:how to get exact message of fatal error in ruby script如何在 ruby​​ 脚本中获取致命错误的确切消息
【发布时间】:2019-06-28 10:35:35
【问题描述】:

我有一个 Ruby 脚本,它从 远程服务器 获取 PostgreSQL 数据库转储。脚本采用动态输入:密码、用户名、主机和数据库名称。因此,用户有可能为这些字段提供错误的输入。如果输入错误,我会得到 fatal error 像

pg_dump: [archiver (db)] 连接到数据库“sc_development1” 失败:致命:数据库“sc_development1”不存在

如果我们这样做时数据库错误,

system("PGPASSWORD="#{source_postgres_password}" pg_dump -U "#{source_postgres_username}" -h "#{source_host}" "#{source_database_name}" > "#{store_backup_file_path}/#{timestamp}/#{source_database_name}".sql")

目前我正在通过检查$? 来处理此问题以获取进程状态,但我想要更多。我想在日志文件中打印准确的致命错误消息。如何做到这一点?

我想将我在终端中看到的确切的致命错误消息从我运行脚本的位置打印到日志文件。

有什么方法可以给我致命错误的详细信息。我知道在 Ruby 中无法挽救致命错误。当我阅读this 时,我可以打印我自己的消息,因为它会处理致命错误,但这不是我想要的。我想要确切的致命错误消息。

【问题讨论】:

  • 来自pg_dump 的错误消息中带有“FATAL”一词的错误与 Ruby 中的致命错误不同。如果您有后者,您的脚本将立即退出并且您无法处理$?。看看Open3——它有多种方法可以与标准输入、标准输出和标准错误进行交互。 capture_3 可能对你有用。
  • 顺便说一句,system 命令的参数缺少一些引号。

标签: ruby postgresql pg-dump pg-restore


【解决方案1】:

您可以使用open3 模块和capture3 函数来捕获标准输出、标准错误和状态:

[3] pry(main)> require 'open3'
=> true
[4] pry(main)> stdout, stderr, status = Open3.capture3("ls asd")
=> ["", "ls: cannot access 'asd': No such file or directory\n", #<Process::Status: pid 19314 exit 2>]

在你的情况下做:

require 'open3'
_, stderr, status = capture3(PGPASSWORD="#{source_postgres_password}" pg_dump -U "#{source_postgres_username}" -h "#{source_host}" "#{source_database_name}" > "#{store_backup_file_path}/#{timestamp}/#{source_database_name}".sql)
puts "Postgres error: #{stderr}"  unless status.error 

另见:https://www.honeybadger.io/blog/capturing-stdout-stderr-from-shell-commands-via-ruby/

【讨论】:

  • 出现错误,Errno::ENOENT: 没有这样的文件或目录 - 来自 /home/raj/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/open3。 rb:213:in `spawn'
  • 这很奇怪 - open3 在标准库中,所以它应该是可用的。
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多