在Rails中处理奇怪异常的最佳实践是什么?

时间:2011-03-24 06:43:52

标签: ruby-on-rails

让我说我在Rails中有这个功能(实际上我使用了P-eval,因为将来会有第三个,第四个或更多个作为class_number):

    def all_profession_costs(class_number)
        second = {'Wealth Ranger' => 1000, 'Wisdom Vacuum' => 1000, 'Life Leecher' => 1000, 'Dense Mass' => 1000}
        costs = eval(class_number)
        costs
    end 

这似乎现在工作正常,但如果我不小心使用'firsta'作为我的class_number,整个事情可能会崩溃,也许会发现一个难以发现的错误。

所以,现在我在想两件事。我当然希望尽可能多地检查一下,但我不喜欢像“引发RuntimeError”这样的东西,因为它会让代码变得更加丑陋。并使它运行得更慢。好吧,我认为后者是可以忍受的,因为检查意味着更好的代码。

然而,我不喜欢丑陋。我正在考虑创建一个单独的ExceptionHandling模块,以便进行类似的验证。

在这个例子中,我想检查class_number是'first','second'还是'third'。

而不是像:

raise RuntimeError unless ['first', 'second', 'third'].include?(class_number.to_s)

也许我可以编写一个简单的模块(可能像Python装饰器一样工作),这将使这个东西更好阅读,我认为更漂亮的代码,如:

validates class_number, :inclusion => ['first', 'second', 'third']

与标准模型验证器类似。

你怎么看?这是个好主意吗?你会如何对待Rails中的一些错误处理?

1 个答案:

答案 0 :(得分:0)

验证 - 在您提供的示例中,您没有拥有来引发异常。如果class_number不是“first”,“second”,“third”之一,你可以简单地返回false。并检查调用方法的响应。这种方法是验证方法。

异常 - 当可能导致错误的错误不是由于用户输入错误而是因为您的逻辑,实现或您无法控制的因素中出现严重错误时引发异常。

但这些并不是硬性规定。它们更像是我通常遵循的准则。

在上面的示例中,它取决于class_number的来源。它来自用户输入吗?我会做验证。如果它不应该来自用户输入,我会提出异常。此外,您不必简单地提出RuntimeError。您可以设计自己的异常类。在你的情况下,像,

class InvalidClassNumber < RuntimeError
end

并做     除非['first','second','third']。include?(class_number.to_s)       提高InvalidClassNumber,“类号可以是'第一','第二'或'第三'。我们得到#{class_number.to_s}”     端

如果你称这种方法,你可以拯救它并做你需要做的任何事情来处理它。

begin
  @profession = @user.profession(class_number)
rescue InvalidClassNumber => e
  # Do whatever you need to
  logger.debug e.message
  # redirect somewhere, or whatever
end

自定义异常类使您可以灵活地处理您期望的那些异常,而不是处理像RuntimeError这样的通用异常。您可以在应用程序中拥有所需数量的异常类。您甚至可以使用::为其命名空间。 Profession::InvalidClassNumber < RuntimeError