【问题标题】:How to raise a custom error code in sinatra?如何在 sinatra 中引发自定义错误代码?
【发布时间】:2012-11-15 09:10:03
【问题描述】:

我在我的 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 - 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

【问题讨论】:

    标签: ruby error-handling sinatra


    【解决方案1】:

    不要使用raise "ERROR!!",而是尝试在状态码后面加上可选的状态消息error 404error 501

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

    【讨论】:

    • 等等,错误是无法正确呈现我的:error 视图,如何访问错误消息(在我的示例中为“ERROR!!”)?
    • 我已更新我的答案以解决消息问题。除此之外,我们可以探索引发自定义错误,这也可能是有益的。
    • 对不起,它不起作用:/(我不得不使用error 501, "ERROR!!")我得到了env['sinatra.error'].message的零类
    【解决方案2】:

    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 会呈现它,即使我按照您在答案中所做的那样设置了状态和正文。
    • 知道了!使用halt STATUS, BODY ;)
    【解决方案3】:

    我在块中使用它

    如果'条件'然后 做一点事 别的 停止 500 ,“错误消息” 结尾 #只有没有错误 erb :my_template

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 2014-02-04
      • 2020-06-27
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多