Как получить этот код Ruby, чтобы вернуть ноль?

Как я могу получить следующий код Ruby для возврата nilесли regvalue не существует?

Прямо сейчас все работает нормально, когда есть что вернуть, а когда нет, выдает эту ошибку:

Не удалось получить fact = 'notepadpp', resolution = '': система не может найти указанный файл.

Я ожидал бы, что он просто ничего не выведет, если запись не существует.

Facter.add(:notepadpp) do
    # restricts module to windows
    confine :kernel => :windows
    setcode do
      require 'facter/util/registry'

      notepadpp = nil
      regvalue = Facter::Util::Registry.hklm_read('SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++', 'Display')
      notepadpp = regvalue if regvalue && !regvalue.empty?

      # if regvalue and not regvalue.empty?
        # notepadpp = regvalue
      # else nil end
    end
end

2 ответа

Спасибо! Вы указали мне в правильном направлении. Дайте мне знать, если это реальное исправление, и я отмечу это ответом. Я взял твой код и добавил спасение.

Facter.add(:notepadpp) do
    confine :kernel => :windows # restricts module to windows
    setcode do
      require 'facter/util/registry'
      begin
        Facter::Util::Registry.hklm_read('SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++', 'DisplayVersion')
      rescue
        nil
      end
    end
end

Я очистил код, и все вдруг заработало:

Facter.add(:notepadpp) do
    confine :kernel => :windows # restricts module to windows
    setcode do
      require 'facter/util/registry'
      Facter::Util::Registry.hklm_read('...\Notepad++', 'Display') rescue nil
    end 
end

#⇒ #<Facter::Util::Fact:0xb907a44 ...>

Функция не достаточно умна, чтобы вернуться nil когда ветка реестра не найдена, она, скорее всего, выдает исключение, поэтому мы должны его обработать.

UPD Если вы не хотите, чтобы этот факт был добавлен, если раздел реестра не существует:

require 'facter/util/registry'
reg_value = Facter::Util::Registry.hklm_read('...\Notepad++', 'Display') rescue nil
Facter.add(:notepadpp) do
    confine :kernel => :windows # restricts module to windows
    setcode do
      regvalue
    end 
end if regvalue
Другие вопросы по тегам