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

Cap*_*ack 0 ruby api exception-handling exception sinatra

我正在尝试在Sinatra中编写一个API,它接受一个临时的CSV文件作为参数.如果文件类型不是text/csv或csv没有电子邮件列,我想引发异常,我希望确认页面只显示错误消息.我想它看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

但是,任何时候不满足其中一个条件,我会得到非常丑陋的错误消息,如NoMethodErrors等.我只是希望API停止执行并在确认页面上返回错误消息.我该怎么做呢?

Chr*_*ung 5

你应该定义一个error块:

error do
  env['sinatra.error'].message
end
Run Code Online (Sandbox Code Playgroud)

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