Как использовать спасение при поднятии LoadError - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь реализовать диалог с файлом, используя Tk. Этот аспект сработал, но моя проверка ошибок не работает.

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

Каждый способ, который я пробовал, заканчивался бесконечным l oop или ошибкой LoadError, останавливавшей программу.

Мой код:

module FileExplorer
  require 'tk'
  require 'tkextlib/tile'

  def self.fileDialog
    TkClipboard.append(Tk.getOpenFile)
    f = TkClipboard.get
    begin
      unless extenstionCheck(f)
        raise LoadError, 'Please select a valid file type'
      end
    rescue LoadError
      fileDialog
    end
  end

  def self.extenstionCheck(file)
    filetypes = ['.xlsx', '.xls', '.csv', '.xml']
    type = File.extname(file)
    true if filetypes.include?(file)
  end
end

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Нет необходимости использовать TkClipboard или исключение.

Неправильное ли написание слова 'extension' ослепило вас из-за ближайшей ошибки проверки, включает ли filetypes file вместо type?

Ваша программа, минимально измененная следующим образом, работает для меня:

module FileExplorer
  require 'tk'
  require 'tkextlib/tile'

  def self.fileDialog
    while true
      f = Tk.getOpenFile
      break if extension_okay?(f)
      Tk.messageBox message: 'Please select a valid file type!', detail: "Selection was: #{f}"
    end
    f
  end

  def self.extension_okay?(file)
    filetypes = ['.xlsx', '.xls', '.csv', '.xml']
    type = File.extname(file)
    filetypes.include?(type)
  end
end
p FileExplorer.fileDialog
0 голосов
/ 06 марта 2020

Это совершенно неуместное (и ненужное) использование LoadError .

Возникает, когда требуемый файл (скрипт Ruby, библиотека расширений,…) не загружается .

Это ошибка низкого уровня, которая не наследуется от StandardError и связана с Kernel#require.

Вместо этого объявляйте собственные исключения в собственном пространстве имен :

module FileExplorer
  require 'tk'
  require 'tkextlib/tile'
  FileTypeError = Class.new(::StandardError)

  def self.fileDialog
    TkClipboard.append(Tk.getOpenFile)
    f = TkClipboard.get
    begin
      unless extenstionCheck(f)
        raise FileTypeError, 'Please select a valid file type'
      end
    rescue FileTypeError
      fileDialog
    end
  end

  def self.extenstionCheck(file)
    filetypes = ['.xlsx', '.xls', '.csv', '.xml']
    type = File.extname(file)
    true if filetypes.include?(file)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...