如何在 ruby 脚本中获取致命错误的确切消息

how to get exact message of fatal error in ruby script

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

pg_dump: [archiver (db)] connection to database "sc_development1" failed: FATAL: database "sc_development1" does not exist

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

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 时,我可以在出现致命错误时打印我自己的消息,但这不是我想要的。我想要准确的致命错误消息。

您可以使用 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/