【问题标题】:Begin and Rescue block exception handling开始和救援块异常处理
【发布时间】:2013-04-18 05:18:09
【问题描述】:

我在 Rails 异常处理方面几乎没有经验。我有这个sn-p

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]" 一切都很完美。 如果出现像 params[:game][:tier] = "[100,200] abc" 这样的 ruby​​ 语法错误情况,它会捕获错误,但是应用程序会崩溃。

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

【问题讨论】:

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


    【解决方案1】:

    如果 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
    

    这也将解决你遇到的异常问题的救援。

    【讨论】:

    • 哇,注射很危险。非常感谢,JSON.parse 确实工作得很好。 :D
    • 再一次证明(在大多数情况下)eval 是邪恶的,可以用更好的东西代替。
    【解决方案2】:

    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
    

    结束

    为了让它发挥作用

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2021-10-24
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多