ruby 如何优雅地处理Sinatra API中的异常

llmtgqce  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(129)

我正在尝试用Sinatra编写一个API,它接受一个临时CSV文件作为参数。如果文件类型不是text/csv或者CSV没有email列,我想抛出一个异常,我想确认页面只显示错误消息。我把它想象成这样:

if params[:recipients_file]
  raise ArgumentError, 'Invalid file. Make sure it is of type text/csv.' unless params[:recipients_file][:type] == "text/csv"
  recipients_csv = CSV.parse(params[:recipients_file][:tempfile].read, {headers: true})
  raise ArgumentError, 'Invalid CSV. Make sure it has an "email" column' unless recipients_csv.headers.include?('email')
  recipients += recipients_csv.map {|recipient| recipient["email"]}
end

然而,任何时候这些条件之一不满足,我得到非常丑陋的错误消息,如NoMethodErrors等。我只想让API停止执行并在确认页面上返回错误消息。我该怎么做?

uidvcgyl

uidvcgyl1#

你应该定义一个error块:

error do
  env['sinatra.error'].message
end

请参阅http://www.sinatrarb.com/intro.html#Error了解更多详细信息,包括如何为不同的异常类型、HTTP状态代码等设置不同的错误处理程序。

jfewjypa

jfewjypa2#

步骤1.首先,你应该在你的main app.rb或server.rb(无论你的文件名是什么)中添加这行代码,这样它就可以捕获下面的错误块。
set :show_exceptions, false
步骤2.异常对象可以从sinatra.error Rack变量中获得。要捕获所有错误,请添加此错误块,例如:code error do...

error do
  env['sinatra.error'].message
end

相关问题