【问题标题】:Handling Ruby "failed with.... "处理 Ruby “失败了......”
【发布时间】:2011-08-12 20:29:29
【问题描述】:
def slicer_imlib2(zoom_level, file_path, output_path)
    begin
      tile_size = 256
      file_path = "public/#{file_path}"

      image = Imlib2::Image.load_image file_path

      image_width = image.width
      image_height = image.height
.....
....
    end
      end
      image = nil
    rescue
      return false
    else
      return true
    end
end

开始救援块不起作用

我来了

[Worker()] UserImage#slice_lib failed with Imlib2::Error::DeletedError: image deleted - 0 failed attempts
[Worker()] UserImage#slice_lib failed with Imlib2::Error::DeletedError: image deleted - 0 failed attempts
[Worker()] UserImage#slice_lib failed with Imlib2::Error::DeletedError: image deleted - 0 failed attempts
[Worker()] 3 jobs processed at 32.5508 j/s, 3 failed ...

如果我得到 Imlib2::Error::DeletedError: image deleted

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    试试

    begin
      # ...
    rescue Imlib2::Error::DeletedError
      # ...
    else
      # ...
    end
    

    rescue(不指定 ErrorClass)只捕获 StandardErrors(Imlib2::Error::DeletedError 直接继承自 Exception)。

    【讨论】:

    • 谢谢!我正在考虑指定,但我 100% 确定它会捕获所有错误
    • 总是捕获所有的方法是写“rescue Exception”,但一般不推荐,因为它真的会捕获所有东西(甚至是SyntaxErrors)
    • 将救援 Imlib2::Error 将捕获与 Imlib2 相关的所有错误?
    【解决方案2】:

    J-_-L 给了你一个很好的答案,但我只是想在实践方面说一些可能会让你免于麻烦的事情。

    在您的示例中,我不会使用异常。如果要检查图像是否被删除,最好使用标准的查找并处理返回值。

    异常通常不应该用于处理用户输入,而是用于寻找奇怪的事情发生。例如,一个期望参数为 1 或 0 的方法突然得到 2 作为输入。那将是一个适当的异常处理位置。

    【讨论】:

    • 图像没有被删除,当没有足够的内存来加载图像时,Imlib2 不会说任何东西,直到您尝试使用指向内存中图像的变量。该库发现指针未指向图像,并打印出“图像已删除”,这与您尝试在 nil 变量上使用 Imlib2 相同。我想库应该将这些异常区分为不同的类型,我花了一些时间才找出“图像被删除”的原因。
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 2014-06-24
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2012-05-10
    • 2014-08-28
    • 2020-06-10
    相关资源
    最近更新 更多