Ruby的redis gem似乎在错误消息中返回整数?

6uxekuva  于 5个月前  发布在  Redis
关注(0)|答案(1)|浏览(79)

我已经实现了一个围绕Ruby的Redis gem的库 Package 器。
有几次当我调用CacheManager.get(“key”)时,它会以某种方式触发一个错误,这个错误在救援中被捕获。错误看起来像这样:undefined method 'join' for 20325:Integer (NoMethodError)。明显的解决方法是在error.message上调用.to_s,但我很想知道发生了什么,为什么Redis返回一个整数作为它的错误消息。

class CacheManager
  def self.get(k, default_value = nil)
    begin
      $redis_pool.with { |conn| conn.get(k) } || default_value
    rescue => error
      Rails.logger.error([error.message] + error.backtrace).join($/)
      default_value
    end
  end
end

字符串

x9ybnkn6

x9ybnkn61#

我假设错误是在这一行提出的:

Rails.logger.error([error.message] + error.backtrace).join($/)

字符串
这不是Redis或redis gem引发的异常,它返回一个整数,导致这一行引发undefined method 'join' for 20325:Integer (NoMethodError)
它是Rails.logger.error返回一个整数,然后对这个整数调用join。该方法的返回值取决于日志记录器的配置和版本。
当重新格式化该行时,该行中的问题变得更加明显:

lines = [error.message] + error.backtrace
Rails.logger.error(lines).join($/)


要修复此问题,需要修复圆括号,以确保在要连接的数组上调用join,而不是logger调用,如下所示:

lines = [error.message] + error.backtrace
Rails.logger.error(lines.join($/))


Rails.logger.error([error.message].concat(error.backtrace).join($/))

相关问题