【问题标题】:ruby raise exception on iteratorruby 在迭代器上引发异常
【发布时间】:2015-07-28 20:20:43
【问题描述】:

以下函数可能返回一个null 值,因此我想使用异常流。有人可以指导我正确的方法吗,因为现在我遇到了错误。

语法错误,意外的keyword_else,期待keyword_end else

def value_from_table1(field, key)
    begin 
      @@connection.query("SELECT #{field} FROM table1 Where key = #{key}  ").each do |row|
        rescue Exception=>e
          puts e
        else 
          return row[field]
        end
    end
end

【问题讨论】:

  • 你应该转义你的查询参数。
  • 如果您采用错误流程,您应该包装row[field] 表达式。参见例如phrogz.net/programmingruby/tut_exceptions.html
  • 为什么不只是确保返回一个可枚举对象(即响应每个对象的对象),那么就不用担心了。同样,现在如果有多行,您只会得到第一行,这似乎也是错误的,但我不确定您要做什么。

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


【解决方案1】:

您将一个块传递给Enumerator#each,它引入了一个新范围,因此您需要将begin 作为异常块的开始。

如果您还需要处理@@connection.query 的异常,只需将rescue 放在.each 的do-end 块之后。 begin 隐含在方法体的开头。

【讨论】:

    【解决方案2】:

    首先,从异常中拯救总是一个坏主意,请参阅Why is it a bad style to `rescue Exception => e` in Ruby? 了解详细信息。

    第二个开始救援块总是必须有一个结束,否则只有在 if before 之后才有可能

    begin
      # ...
    rescue StandardError => e 
      # ...
    end
    

    正如贾斯汀·特纳在评论中已经说过的第三个,只是将一个值传递给数据库,这样就容易发生 SQL 注入。您有什么理由不使用 ActiveRecord 但想要直接访问数据库?

    总的来说,这段简短的代码存在很多问题,我建议阅读http://guides.rubyonrails.org/ 以更好地了解发生了什么。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2020-05-20
      • 2011-01-16
      • 2012-01-13
      • 2011-07-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多