ruby – 当我引发RuntimeError时,为什么Sinatra的“show_exceptions.rb”文件崩溃了?

前端之家收集整理的这篇文章主要介绍了ruby – 当我引发RuntimeError时,为什么Sinatra的“show_exceptions.rb”文件崩溃了?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的应用程序:
require "sinatra"

get "/" do
  raise "Oops!"
end

由于这是一个调试环境,我希望看到一个“RuntimeError:糟糕!”显示在浏览器中.相反,似乎Sinatra崩溃了:

NoMethodError at /
undefined method `join' for #<String:0x00000002b74bf0>

Ruby    /home/tomas/.rvm/.../gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb: in rescue in call,line 37
Web     GET 127.0.0.1/

在控制台中的Backtrace:

RuntimeError - Oops!:
    test.rb:5:in `block in '
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (3 levels) in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:985:in `route_eval'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (2 levels) in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1006:in `block in process_route'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `process_route'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:964:in `block in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `each'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1076:in `block in dispatch!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1073:in `dispatch!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `block in call!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `call!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:886:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/logger.rb:15:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/commonlogger.rb:33:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:217:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:210:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/head.rb:13:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/methodoverride.rb:22:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:21:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/handler/webrick.rb:89:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
[2014-10-08 12:42:42] ERROR NoMethodError: undefined method `join' for #<String:0x007f52e055ce38>
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:37:in `rescue in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:21:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/handler/webrick.rb:89:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
localhost - - [08/Oct/2014:12:42:42 CEST] "GET / HTTP/1.1" 500 340

这对我来说完全没有帮助.这里发生了什么?

解决方法

看起来 recent change in Rack在Sinatra中引入了这个bug,has been fixed但修复版本没有(在撰写本文时)已包含在发行版中.

最简单的修复(直到更新的Sinatra gem发布)将使用早期版本的Rack(此更改目前仅在1.6.0.beta中).如果您正在使用Bundler,或者在脚本开头附近(在您需要任何内容​​之前),请将此行添加到您的Gemfile中,如果您不是:

gem 'rack','1.5.2'

猜你在找的Ruby相关文章