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

时间:2012-11-27 17:13:53

标签: ruby error-handling sinatra

我在sinatra app中做了以下事情:

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 - Internal Server Error响应代码,这是上帝和想要的。但是如何将代码更改为例如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 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:4)

我在块

中使用它
if 'condition'  then 
   do something
else 
   halt 500  , "error message"
end 
#only without error
erb :my_template

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

答案 2 :(得分:2)

而不是raise "ERROR!!",只需在状态代码后使用可选状态消息执行error 404error 501

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