引发 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
的使用完全不恰当(且不必要)
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
我正在尝试使用 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
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