我的用例是我想在sinatra中进行错误处理。为此,我设置错误处理程序,如下所示
error 0..600 do
@@logger.error("error reason #{env['sinatra.error']}")
end如果错误是由显式引发异常引起的,则可以正常设置sinatra.error变量
get '/' do
raise "Fail the request"
end 但是,如果使用halt来终止请求,则不会设置sinatra.error。查看sinatra代码,这似乎是预期的,因为抛出:halt会导致控制流一直向上调用,从而绕过sinatra.error变量的设置。
我的问题是如何在挂起的同时使用错误处理程序,这样我就可以在错误处理程序中找到错误的原因。
发布于 2012-01-21 00:13:37
我认为您看到的行为源于halt的预期目的。当您调用它时,您不一定是在发送错误信号;您只是希望立即停止执行,这在筛选器中特别有用。如果你查看Sinatra的自述文件,它说你使用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的错误代码。
https://stackoverflow.com/questions/8925004
复制相似问题