我希望向尝试从csv
导入数据的用户提供尽可能多的反馈。问题在于我需要救出CSV::MalformedCSVError
的案例,因为异常消息是英文的(我不能使用英文),没有其他方法可以将一个错误与另一个错误区分开来。
我该怎么做才能向用户显示确切的问题?
答案 0 :(得分:1)
我注意到你把它标记为Rails,这意味着你有I18n。你为什么不做以下的事情:
begin
# csv parsing code
rescue CSV::MalformedCSVError => ex
raise(CSV::MalformedCSVError.new(I18n.t("csv_parser.malformed_csv_error"))
end
注意:这确实假设CSV :: MalformedCSVError继承自StandardError,这可能不是这种情况,但是您可以理解,引发异常并将消息设置为某些已翻译的I18n字符串。
更新:
如果您想要更多详细信息,您可以匹配异常消息并为每种消息类型进行翻译,同时从错误消息字符串中捕获您想要的数据 - 例如行号等。我现在不知道什么是错误消息看起来像,但你说你有类似“第45栏中的错误”,然后你可以做以下
begin
# csv import code
rescue CSV::MalformedCSVError => ex
err_message = case ex.message
when /column (\d+)/
I18n.t("csv_error.column_error_message", column: Regexp.last_match[1])
else
I18n.t("csv_error.generic_message")
end
raise(CSV::MalformedCSVError.new(err_message))
end
答案 1 :(得分:1)
我已经把这个猴子补丁变成了宝石。检查出来,以及测试套件:
https://github.com/jhubert/csv-i18n
我遇到了这个问题并决定除非我向用户显示无用的错误消息,否则我可以选择两种方式:
第一种方式可能是正确的方法,因为我控制源代码并且可以使用我想要处理传入CSV文件的任何类。
然而,我对此非常鲁莽,我喜欢这样的想法,即在系统中的任何地方进行的任何CSV解析都会返回已翻译的消息,而其他人无需了解FriendlyCSV
类。
所以,我选择#2。
你可以在这里找到补丁: https://gist.github.com/jhubert/7d75586857d41fb4c45c4491363636e9
核心行为是我们覆盖了shift
方法,这是大部分字符串解析的地方。我们正在尝试翻译错误消息,然后返回原始异常。
def shift
super
rescue ::CSV::MalformedCSVError => exception
raise $!, translated_exception_message(exception.message), $!.backtrace
end
希望有所帮助!