【问题标题】:Sinatra - Error HandlingSinatra - 错误处理
【发布时间】:2014-12-01 18:10:30
【问题描述】:

当服务器上出现错误(例如 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);
      }
    })

  })
})

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    默认情况下,Sinatra 在development 环境中运行时会吞下异常,并显示其调试错误页面。因此,要触发您的自定义错误处理程序,您必须在 development(可能是 production)以外的 Rack 环境中运行应用程序,或者最好告诉 Sinatra 不要使用其默认错误development 模式下的处理程序。

    考虑以下独立的 Sinatra 应用程序示例:

    require "sinatra"
    
    #disable :show_exceptions
    
    get "/" do
      raise RuntimeError.new("boom")
    end
    
    error RuntimeError do
      "A RuntimeError occured"
    end
    

    如果您使用默认的development 环境运行此应用程序,如下所示:

    $ ruby foo.rb
    

    然后你会得到 Sinatra 的默认错误页面。如果您在示例中取消注释 disable 行,则将触发 error 处理程序,显示包含“发生运行时错误”的页面。或者,如前所述,您可以在development 以外的环境中运行应用程序,因为只有该环境预先设置了show_exception 设置。您可以通过设置RACK_ENV 环境变量来做到这一点:

    $ RACK_ENV=production ruby foo.rb
    

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

    configure :development do
      disable :show_exceptions
    end
    

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

    【讨论】:

    • 我还必须在 ajax 中添加一个错误块来捕获错误,但非常感谢,这真的很有帮助......
    • dump_errors 是另一个有用的,它将把跟踪打印到 STDERR
    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2019-10-16
    • 1970-01-01
    • 2021-10-29
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多