I don't know when Redmine will be back up, so: Exception objects allow an arbitrary object for the message: >> RUBY_REVISION => 30240 >> FiberError.exception([]).message => [] >> Exception.new(Object.new).message => #<Object:0x00000002a283f0> And Exception#to_s returns said object verbatim: >> FiberError.exception([]).to_s => [] This breaks the contract of #to_s returning either a String or nil.