友好的方式向非英语人士展示MalformedCSVError

时间:2014-10-22 19:02:16

标签: ruby-on-rails ruby csv

我希望向尝试从csv导入数据的用户提供尽可能多的反馈。问题在于我需要救出CSV::MalformedCSVError的案例,因为异常消息是英文的(我不能使用英文),没有其他方法可以将一个错误与另一个错误区分开来。
我该怎么做才能向用户显示确切的问题?

2 个答案:

答案 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)

更新:GEM

我已经把这个猴子补丁变成了宝石。检查出来,以及测试套件:

https://github.com/jhubert/csv-i18n

原始答案

我遇到了这个问题并决定除非我向用户显示无用的错误消息,否则我可以选择两种方式:

  1. 介绍一个新的类,例如FriendlyCSV,它包装了CSV解析器,检查了异常消息并以正确的语言返回了相关的错误消息。
  2. 对CSV库进行Monkey-patch以返回已翻译的错误消息。
  3. 第一种方式可能是正确的方法,因为我控制源代码并且可以使用我想要处理传入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
    

    希望有所帮助!