开始和救援块异常处理

Posted

技术标签:

【中文标题】开始和救援块异常处理【英文标题】: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()' 处理异常,以免破坏应用程序?为什么在这种情况下开始和救援不起作用?感谢任何对红宝石启蒙的帮助:)

【问题讨论】:

【参考方案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

结束

为了让它发挥作用

【讨论】:

永远,永远拯救异常 同意,拯救StandardError。来源:robots.thoughtbot.com/rescue-standarderror-not-exception

以上是关于开始和救援块异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Java随笔四---Java异常

Berry 异常处理实现

java中 在一个异常处理中啥语句块是可多个的

五种异常处理机制

如何使用多个catch块处理异常

Java异常处理