2014-10-07 83 views
1

我试图让我的sinatra应用程序在服务器上发生错误(例如IOError或ArgumentError)时显示自定义错误页面。Sinatra - 错误处理

目前我正在使用AJAX将结果加载到某个#results div,但如果在服务器出现错误时,我想要在新页面上打开错误页面。

当前,IOError显示在服务器上,并且在控制台中显示错误(服务器响应的状态为500(内部服务器错误))。除此之外,没有任何反应。

我认为我必须玩Javascript(以及Sinatra :: Base类),但我已经花了整个昨天和今天早上没有得到任何地方。

我会很感激任何帮助。我创建我的应用程序过于简单的版本,我在下面显示...

Sinatra_app.rb

require 'sinatra/base' 
require9 'sinatra' 
require 'slim' 

# A helper module 
module GVhelpers 
    def create_results(name) 
    # raise IOError, "There's a problem..." 
    return "<p>The Server Says 'Hey #{name}'</p>" 
    end 
end 

class GVapp < Sinatra::Base 
    helpers GVhelpers 
    set :root, File.dirname(__FILE__) 

    error do 
    @error = env['sinatra.error'] 
    slim :"500", :locals => {:error => error} 
    end 

    get '/' do 
    slim :index 
    end 

    post '/form' do 
    name = params[:personName] 
    create_results(name) 
    end 
end 

GVapp.run! 

index.slim(在视图中的文件夹)

script src="/jquery.min.js" 
script src="/Gvapp.js" 

form#sayHey action="/form" method="post" 
    | Name: 
    input type="text" name="personName" 
    br 
    input type="submit" 
#output 

500.slim(在视图文件夹中)

h1 Oops! Something went Wonky! 
p Apologies, there was an error with your request: 
    strong request.env['sinatra.error'].message 
p If the error persists, please contact the administrator. 

Gvapp.js(公共文件夹)

$(document).ready(function() { 

    $('#sayHey').submit(function(e) { 

    e.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     url: '/form', 
     data: $('#sayHey').serialize(), 
     success: function(response){ 
     $('#output').html(response); 
     } 
    }) 

    }) 
}) 

回答

4

西纳特拉在development环境默认运行并显示其调试错误页面,而不是当燕子例外。因此,要触发自定义错误处理程序,您必须在除development(可能为production)之外的Rack环境中运行应用程序,或者最好告诉Sinatra 而不是development模式下使用其默认错误处理程序。

考虑下面的,独立的西纳特拉应用举例:如果您运行使用默认development环境这样该应用

require "sinatra" 

#disable :show_exceptions 

get "/" do 
    raise RuntimeError.new("boom") 
end 

error RuntimeError do 
    "A RuntimeError occured" 
end 

$ ruby foo.rb 

然后你会得到Sinatra的默认错误页面。如果您在示例中取消注释disable行,则将触发error处理程序,而不是显示包含“发生A RuntimeError”的页面。或者,您可以像解释的那样在除development之外的环境中运行应用程序,因为只有该应用程序预先设置了show_exception设置。你可以做,通过设置RACK_ENV环境变量:

$ RACK_ENV=production ruby foo.rb 

对于开发目的,设置RACK_ENVproduction当然不是正确的方法。改为使用disable :show_exceptions。您可以使用configure块作为outlined in the Sinatra README以有条件地禁用development环境的设置。

configure :development do 
    disable :show_exceptions 
end 

该行为记录在Sinatra’s documentation on configuration以及其他一些有用的设置中。

+0

我也不得不添加一个错误块到ajax来捕捉错误,但是非常感谢,真的有帮助... – 2014-10-07 16:01:39

+0

'dump_errors'是另一个有用的,它将打印跟踪到STDERR – 2017-08-18 21:06:58