【问题标题】:Ruby - "Do" loop and "rescue"Ruby - “做”循环和“救援”
【发布时间】:2015-12-16 11:15:08
【问题描述】:

我正在使用 Microsoft 计算机视觉 API。该 API 可以识别人脸并提供有关图像中有多少人、估计他们的年龄以及估计的性别的数据。但是,我有一个无法“拯救”的“do”循环。下面是代码:

 values = json_data['faces'].map do |result| 

这是我收到的错误:

C:/Users/KVadher/Desktop/micr1.rb:122:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)

我希望我的代码看起来像这样:

 begin
  values = json_data['faces'].map do |result| 
 rescue
 end

但是,当我这样做时,我收到以下错误:

C:/Users/USERNAME/Desktop/micr1.rb:123: syntax error, unexpected keyword_rescue

如果请求不适用,我如何传递我的代码?

【问题讨论】:

    标签: ruby loops rescue


    【解决方案1】:

    map 块应该有 end

    begin
      values = json_data['faces'].map do |result|
        # ...
      end
    rescue
    end
    

    【讨论】:

      【解决方案2】:

      正如 Alexander 指出的那样,do 语句中缺少 end 解释了意外的关键字错误。

      但是,以这种方式使用救援是not good practice。它将有效地掩盖将来发生的任何问题。您应该始终明确您所拯救的内容。所以这样会更好:

      begin
        values = json_data['faces'].map do |result|
          ...
        end
      rescue NoMethodError
      end
      

      但是,错误告诉您json_data 为零。所以为了处理这个问题,一个更简单的解决方案是:

      if json_data
        values = json_data['faces'].map do |result|
           ...
        end
      else
        values = [] # or whatever you want values to be if there are none
      end
      

      【讨论】:

      • 当 json_data 存在且它不是哈希时,您的代码将引发错误
      • @AlexanderShlenchack 这是真的——但强调了我的观点。你应该构建你的代码来处理你知道的错误,并让其他错误在系统中冒出来。提到的唯一需要以编程方式处理的错误是json_data == nil。如果 json 可以是 hash 或 nil 以外的东西,那么这也需要处理,但问题中没有任何内容表明这种情况。
      • 我完全同意你的看法。这是我的小评论,仅此而已。
      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 2013-08-31
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多