引发 LoadError 时如何使用救援

How to use rescue when a LoadError is raised

我正在尝试使用 Tk 实现文件对话框。这方面有效,但我的错误检查无效。

因为这个文件对话框只能采用某些扩展名,所以我让它引发了一个 LoadError,但我也不希望程序停止,我希望它重新打开以允许用户选择另一个文件。

我尝试过的每一种方法都只以无限循环或 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

LoadError.

的使用完全不恰当(且不必要)

Raised when a file required (a Ruby script, extension library, …) fails to load.

这是一个低级错误,不继承自 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

不需要使用 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