如何在Sinatra中引发自定义错误代码?

27

我在我的Sinatra应用程序中做了以下操作:

disable :show_exceptions
disable :raise_errors

error do
  haml :error, :locals => {:error_message => request.env['sinatra.error'].to_s}
end

get '/error' do
  raise "ERROR!!"
end

如果我访问 /error,我会得到一个 500 - 内部服务器错误 的响应代码,这是好的和想要的。但是我应该如何将代码更改为404或501之类的呢?

答案:

disable :show_exceptions
disable :raise_errors

get '/error' do
  halt(404,haml(:error, :locals => {:error_message => request.env['sinatra.error'].to_s}))
end
3个回答

26

类似于 raise 404 这样的语句会像 raise ZeroDivisionError 一样引发错误,从而导致应用程序抛出 500 内部服务器错误。返回特定错误的最简单方法是使用 status

get '/raise404' do
    status 404
end

您还可以使用 body 添加自定义响应正文

get '/raise403' do
    status 403
    body 'This is a 403 error'
end

好的,那个可以工作。但是我该如何停止请求呢?因为如果在路由结束时有视图需要渲染,Sinatra会进行渲染,即使我已经像你在答案中所做的那样设置了状态和正文。 - le_me
10
明白了!使用halt 状态码, 响应体即可 ;) - le_me

6

我在块中使用这个

如果 '条件' 那么
   做某事
否则
   停止 500,"错误信息"
结束
#仅在没有错误时
erb :my_template

如果出现错误,我的日志会像这样
HTTP/1.1" 500 13 0.1000


2

不要使用raise "ERROR!!",尝试使用error 404error 501,可选状态消息在状态码后。

更新: 如果您将错误处理程序定义为error 400..501 do...,则可以在"/error"路由中使用error 501 "ERROR!!"。这也会将您的"ERROR!!"消息放入env['sinatra.error'].message中。


等等,无法正确渲染我的 :error 视图以显示错误,我该如何访问错误消息(例如 "ERROR!!")? - le_me
我已更新我的答案以解决消息问题。除此之外,我们还可以探讨提高自定义错误的好处。 - jboursiquot
2
很抱歉,它无法工作:/(我不得不使用错误501,“ERROR!!”)对于env['sinatra.error'].message,我得到了一个零类。 - le_me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接