как получить точное сообщение о фатальной ошибке в скрипте ruby - PullRequest
2 голосов
/ 28 июня 2019

У меня есть скрипт Ruby, который принимает Дамп базы данных PostgreSQL с удаленного сервера . Скрипт принимает динамический ввод для: пароля, имени пользователя, хоста и имени_базы_данных. Таким образом, есть вероятность, что пользователь может ввести неправильные данные для этих полей. В случае неправильного ввода я получаю фатальную ошибку как

pg_dump: [archiver (db)] подключение к базе данных "sc_development1" Сбой: FATAL: база данных "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")

В настоящее время я занимаюсь этим, проверяя $?, чтобы получить статус процесса, но я хочу больше Я хочу получить точное сообщение об ошибке Fatal для печати в файле журнала. Как это сделать?

Я хочу напечатать точное фатальное сообщение об ошибке, которое я вижу в терминале, откуда я запускаю скрипт, в файл журнала.

Есть ли способ дать мне информацию о фатальной ошибке. Я знаю, что в Ruby невозможно спасти фатальную ошибку. Когда я читаю this , я могу напечатать свое собственное сообщение, которое обрабатывается в случае фатальной ошибки, но это не то, что я хочу. Я хочу точное сообщение о фатальной ошибке.

1 Ответ

4 голосов
/ 28 июня 2019

Вы можете использовать open3 модуль и capture3 функцию, которая позволяет вам захватывать stdout, stderr и статус:

[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/

...