2013-04-24 138 views
2

我在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 [:游戏] [:一线] = “[100,200]” 一切都是完美的。 如果出现ruby语法错误的情况,如params [:game] [:tier] =“[100,200] abc”,则会发现错误,但应用程序只是粉碎。

如何处理“eval()”的异常,使其不会破坏应用程序?为什么在这种情况下开始和营救不起作用?感谢所有帮助红宝石启蒙谢谢:)

回答

4

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

因为输入的数据预计将是一个数组,我不会用evalJSON.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

哇,这是危险的注射。很多感谢,而JSON.parse确实工作得很好。 :D – sovanlandy 2013-04-24 15:29:57

+3

再一次证明(在大多数情况下)'eval'是邪恶的,可以用更好的方式取代。 – 2013-04-24 15:31:55

+0

赞同padde :) – sovanlandy 2013-04-24 15:32:43

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 

,以使其工作

+5

从来没有,曾经救援异常 – bhaity 2015-02-03 00:13:59

+0

同意,救援'StandardError'而不是。来源:https://robots.thoughtbot.com/rescue-standarderror-not-exception – JackCollins 2016-09-06 20:26:34