Ruby Redis gem为何在错误消息中返回整数?技术问询
问题分析与解决
为什么Redis会返回整数作为错误消息?
这个整数20325是系统错误码(errno),并非Redis服务直接返回的错误信息。Ruby的Redis gem在处理底层网络/系统级异常时(比如连接池获取超时、Socket读写错误、系统资源不足等场景),部分分支的错误处理逻辑没有将系统错误码转换为对应的字符串描述,直接把整数形式的错误码赋值给了异常对象的message属性,导致你拿到的error.message是整数而非字符串。
你的代码报错的直接原因
看你日志行的写法:
Rails.logger.error([error.message] + error.backtrace).join($/)
这行代码的执行顺序是:先调用Rails.logger.error传入数组,然后对logger.error的返回值调用join。而Rails.logger.error在接收非字符串参数时,内部处理可能返回了error.message对应的整数20325,此时对整数调用join方法就触发了NoMethodError。
修复方案
正确的写法是先把异常信息拼接成字符串,再传给日志方法:
class CacheManager def self.get(k, default_value = nil) begin $redis_pool.with { |conn| conn.get(k) } || default_value rescue => error error_details = [error.message.to_s] + error.backtrace Rails.logger.error(error_details.join($/)) default_value end end end
这里做了两个关键调整:
- 先将
error.message转为字符串,避免数组中混入整数类型 - 先完成数组的
join操作得到完整错误字符串,再传给Rails.logger.error
内容的提问来源于stack exchange,提问作者zilla
相关产品推荐
相关产品推荐

