【问题标题】:Invoking halt in sinatra does not set sinatra.error在 sinatra 中调用停止不会设置 sinatra.error
【发布时间】:2012-01-21 00:13:37
【问题描述】:

我的用例是我想在 sinatra 中进行错误处理。为此,我将错误处理程序设置如下

error 0..600 do
  @@logger.error("error reason #{env['sinatra.error']}")
end

如果错误是由显式引发异常引起的,则 sinatra.error 变量会被正确设置

get '/' do
  raise "Fail the request"
end 

但如果使用停止来终止请求,则不会设置 sinatra.error。查看 sinatra 代码,这似乎符合预期,因为抛出 :halt 会导致控制流一直向上调用,从而绕过 sinatra.error 变量的设置。

我的问题是如何将错误处理程序与停止一起使用,以便我可以在错误处理程序中找到错误的原因。

【问题讨论】:

    标签: sinatra


    【解决方案1】:

    我认为您看到的行为源于halt 的预期目的。当你调用它时,你不一定会发出错误的信号。您只想立即停止执行,这在过滤器中特别有用。如果您查看 Sinatra 的 README,它会说您使用 halt 来“立即停止过滤器或路由使用中的请求”。当然,您通常会因为错误而这样做。

    有趣的是,您定义的错误处理程序不仅会在发生错误时被调用,而且还会在处理常规请求时被调用,包括状态为 200 的请求。在这些情况下,env[sinatra.error] 不会被设置要么。

    您可以在错误处理程序中执行的操作是检查异常,如果不可用,请检查响应代码。例如(注意这是一个经典的应用程序):

    error 0..600 do
      boom = @env['sinatra.error']
      status = response.status
      case
      when boom != nil
        puts 'exception: ' + boom
      when status != 200
        puts 'error: ' + status
      end
    end
    

    一个结果是,在此处理程序中,正常请求与被halt 中断的请求无法区分,因为两者都会生成 200 状态代码。但是,如果您使用 halt 报告错误,那么您应该使用 500 之类的错误代码。

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 2016-03-12
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2015-05-30
      • 2013-10-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多