开始和救援块异常处理

时间:2013-04-24 15:12:03

标签: ruby-on-rails ruby exception-handling

我在rails异常处理方面经验不足。我有这个片段

def update
  @game = Game.find(params[:id])
  begin
    params[:game][:tier] = eval(params[:game][:tier]) 
  rescue 
    @game.errors.add(:tier, "Please make sure the correct format for tier, example [100, 1000, 10000]")
  end
#.... more code
end

如果params [:game] [:tier] =“[100,200]”一切都很完美。 如果出现错误的ruby语法情况,例如params [:game] [:tier] =“[100,200] abc”它会捕获错误,但应用程序只是粉碎。

如何使用'eval()'来处理异常,以免破坏应用程序?为什么开始和救援在这种情况下不起作用?感谢任何对红宝石启蒙的帮助,谢谢:)

2 个答案:

答案 0 :(得分:4)

如果params[:game][:tier]"[100,200]; system('rm -rf /')"怎么办?

由于传入的数据应该是一个数组,我不会使用eval而是使用JSON.parse

> JSON.parse("[100,200]")
 => [100, 200]
> JSON.parse("[100,200] abc")
JSON::ParserError: 746: unexpected token at 'abc'...

然后仅从JSON::ParserError例外救援

rescue JSON::ParserError => e

这也将解决救援问题,而不是解决您遇到的异常问题。

答案 1 :(得分:1)

this

的副本

然而你应该以这种方式拯救

def update
  @game = Game.find(params[:id])
  begin
    params[:game][:tier] = eval(params[:game][:tier]) 
  rescue Exception => e
    @game.errors.add(:tier, "Please make sure the correct format for tier, example [100, 1000, 10000]")
  end
#.... more code

为了使其发挥作用