首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sinatra中调用halt不会设置sinatra.error

在sinatra中调用halt不会设置sinatra.error
EN

Stack Overflow用户
提问于 2012-01-19 19:07:08
回答 1查看 641关注 0票数 2

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

代码语言:javascript
复制
error 0..600 do
  @@logger.error("error reason #{env['sinatra.error']}")
end

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

代码语言:javascript
复制
get '/' do
  raise "Fail the request"
end 

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

我的问题是如何在挂起的同时使用错误处理程序,这样我就可以在错误处理程序中找到错误的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-21 00:13:37

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

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

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

代码语言:javascript
复制
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的错误代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8925004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档